2014-12-16 28 views
25

hovariabili globali in Meteor

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 unico 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.

Viene visualizzato 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.

+0

è 'Schemas' una variabile globale? lo carichi usando 'require'? forse hai bisogno di mostrarci altro codice perché siccome il codice è scritto non ci dovrebbero essere problemi –

+3

possibile duplicato di [Come posso accedere alle costanti nel file lib/constants.js in Meteor?] (http://stackoverflow.com/ domande/26836390/how-can-i-access-constants-in-the-lib-constants -js-file-in-meteor) –

risposta

53

Quando si definisce una variabile nel modo classico JavaScript:

var someVar = 'someValue'; 

alla radice del file .js Meteor Scopes al file usando un IIFE.

Se si desidera definire una variabile globale, semplicemente non scrivere il var, dando:

someVar = 'someValue'; 

Ciò definire una variabile in tutte le vostre applicazioni di default, anche se si può limitare scrivendo che dichiarazione in una cartella (client o server ad esempio).

Tuttavia questa variabile non sarà definita in assoluto prima. Sarà definito quando Meteor esegue il codice effettivo che lo definisce. Quindi, 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 loads files: in quale cartella inserisci il file, il nome del file ... Il tuo codice è incline a errori disordinati se tocchi leggermente la tua architettura.

Come ho suggerito in another closely related post si dovrebbe andare per un pacchetto direttamente!

+0

Cerco di definire le mie variabili globali nella directory lib ma i pacchetti sono decisamente più robusti – CleoR

+3

I 'Vorrei aggiungere che questo è davvero interessante perché puoi avere un file constants.js nel tuo/client e un altro nelle tue directory/server. E se si desidera condividere un file di costanti tra entrambi, è possibile crearlo in/lib/costanti. –

+0

Questo non è un problema di Meteor. Vedi sotto per ReferenceError. –

11

variabili in Meteor dichiarate con la parola chiave var vengono ambito al file che sono dichiarati in.

Se si desidera creare una variabile globale fare questo

Schemas = {} 
+3

Non sono sicuro di come mi sento al riguardo ... non esiste un modo ES6/stile web per importare le variabili da un altro file in modo da evitare i globals? – Andy

2

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

Il nodo ha una portata globale (ovvero 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 generano ReferenceErrors quando si accede a variabili non definite.

Ecco uno schema che mi piace per l'aggiunta di funzionalità a una classe (è molto Meteor):

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

Considerare 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é si otterrà un ReferenceError dal nodo se aiutanti non è definito - in particolare i "aiutanti" utilizzati come argomento. (Il nodo sa assegnare gli helper come helper globali).

Qui ci sono due modi per "risolvere" questo:

1) Assegnare 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 succhiano.

1) La sintassi di 1) è orribile.
2) funziona nel nodo, ma non esiste un browser globale. 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 si dispone di una comoda sintassi cross-browser, commentare :-) var qualcosa = qualcosa || {} something.blah = foo;

Ecco alcuni altri JS shorthand tips.

+0

Si noti che il terzo pezzo di codice deve essere aggiunto all'inizio di ogni file che deve utilizzare una variabile globale, per ogni variabile da utilizzare. –

+1

Puoi spiegare perché hai fatto riferimento a ES6 e in che modo questo è pertinente alla domanda? – Fletch

+0

@Fletch umm ... in realtà no. Quindi l'ho rimosso. Per qualche motivo, ho pensato che i moduli ES6 avrebbero aiutato a ripulire lo spazio dei nomi globale, ma non riesco a trovare nulla a riguardo: - / –

0

Le variabili di sessione sono globali e sono facilmente accessibili 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 e potrebbero dare errori nella console. Link ai documenti: https://docs.meteor.com/api/session.html