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.
è '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 –
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) –