Variabili globali in Meteor

io ho

var Schemas = {}; Meteor.isClient && Template.registerHelper("Schemas", Schemas); Schemas.Person = new SimpleSchema({ fullName: { type: String, index: 1, optional: true, }, email: { type: String, optional: true }, address: { type: String, optional: true }, isActive: { type: Boolean, }, age: { type: Number, optional: true } }); 

in un file e

 var Collections = {}; Meteor.isClient && Template.registerHelper("Collections", Collections); Persons = Collections.Persons = new Mongo.Collection("Persons"); Persons.attachSchema(Schemas.Person); 

in un altro file.

Ottengo l’errore ReferenceError: Schemas is not defined . È piuttosto ovvio che devo definire Schemas nel mio file collections.js invece di averli separati. Ma come fa Meteor a lavorare con il codice in file separati? Posso accedere ad alcuni oggetti e variabili mentre altri non sono accessibili.

Quando definisci una variabile nel classico modo JavaScript:

 var someVar = 'someValue'; 

alla radice del tuo file .js Meteor lo scopre sul file usando un IIFE .

Se si desidera definire una variabile globale, semplicemente non scrivere la var , fornendo:

 someVar = 'someValue'; 

Questo definirà una variabile in tutte le applicazioni per impostazione predefinita, sebbene sia ansible limitarla scrivendo tale dichiarazione in una specifica cartella riconosciuta ( cartella client o server ad esempio).

Tuttavia questa variabile non sarà definita assolutamente prima. Sarà definito quando Meteor esegue il codice effettivo che lo definisce. Pertanto, potrebbe non essere la migliore pratica perché hai difficoltà con l’ordine di caricamento, e renderà il tuo codice dipendente dal modo in cui Meteor carica i file : in quale cartella inserisci il file, il nome del file … Il tuo il codice è sobject a errori disordinati se si tocca leggermente la propria architettura.

Come ho suggerito in un altro post strettamente correlato , dovresti andare direttamente a un pacchetto!

Le variabili in Meteor dichiarate con la parola chiave var hanno come ambito il file in cui sono dichiarate.

Se vuoi creare una variabile globale fallo

 Schemas = {} 

ReferenceError è un errore del nodo. Meteor è un framework in cima al Node.

Il nodo ha un ambito globale (la variabile global del Nodo). Questo errore viene generato dal nodo (non da Meteor) se si tenta di accedere a una variabile globale indefinita.

I browser hanno anche un ambito globale chiamato window e non lanciare ReferenceErrors quando si accede a variabili non definite.

Ecco uno schema che mi piace per aggiungere funzionalità a una class (è molto Meteor):

 /lib/Helpers.js <-- Helpers for everyone (node+browser) /server/Helpers.js <-- Server helpers (node) /client/Helpers.js <-- Client helpers (browser) 

Considera queste implementazioni:

 // /lib/Helpers.js Helpers = {/* functions */}; // Assigned to window.Helpers and global.Helpers // /server/Helpers.js Helpers = _.extend(Helpers, {/*more functions*/} // /client/Helpers.js Helpers = _.extend(Helpers, {/*more functions*/} 

Questo è un esempio banale. Cosa succede se non volessi preoccuparmi per l'ordine di caricamento? Perché non _.extend () in /lib/Helpers.js?

 // /lib/Helpers.js // Helpers = {/* functions */}; // Overwrites... Helpers = _.extend(Helpers, {/* functions */}); // ReferenceError 

Perché otterrai un ReferenceError dal nodo se gli Helpers non sono definiti, in particolare gli "Helpers" utilizzati come argomento. (Il nodo sa assegnare gli helper come helper globali).

Ecco due modi per "risolvere" questo:

1) Assegna gli aiutanti a qualcosa

 // /lib/Helpers.js // Helpers = Helpers || {} // would be another ReferenceError if (typeof Helpers === 'undefined') Helpers = {}; Helpers = _.extend(Helpers, {/* functions */}); 

2) Utilizzare gli helper dal globale

 // /lib/Helpers.js Helpers = _.extend(global.Helpers, {/* functions */}); // works in node, but... 

Entrambi che fanno schifo.

La syntax di 1) è orribile.
2) funziona nel nodo, ma non c'è globale nei browser. Quindi fallisce è lo scopo.

Così ho rinunciato e sono tornato a sovrascriverlo la prima volta in lib, e alla ricerca di errori di runtime se qualcosa è stato sovrascritto.

Se hai una comoda syntax cross-browser, commenta 🙂 var qualcosa = qualcosa || {} something.blah = foo;

Ecco alcuni suggerimenti per la stenografia di JS .

Le variabili di sessione sono globali e si può accedere facilmente in diversi file / funzioni. Session.setPersistent viene utilizzato per impostare il nome della variabile in modo persistente su tutti i file. Si potrebbe limitare l’uso delle variabili di sessione quando la loro app è troppo grande in quanto non vengono eliminate (quindi possibili perdite di memoria) e potrebbe dare un errore nella console (se non definito o così). Link ai documenti: https://docs.meteor.com/api/session.html