Variables globales dans Meteor
{j'ai[6]}
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
}
});
Dans un fichier et
var Collections = {};
Meteor.isClient && Template.registerHelper("Collections", Collections);
Persons = Collections.Persons = new Mongo.Collection("Persons");
Persons.attachSchema(Schemas.Person);
Dans un autre fichier.
Je reçois l'erreur ReferenceError: Schemas is not defined
. Il est plutôt évident que je dois définir Schemas
dans mon fichier collections.js
au lieu de les avoir séparés. Mais comment Meteor fonctionne-t-il avec du code dans des fichiers séparés? Je peux accéder à certains objets et variables, tandis que d'autres sont inaccessibles.
4 réponses
Lorsque vous définissez une variable de la manière JavaScript classique:
var someVar = 'someValue';
À la racine de votre fichier .js
Meteor l'étend au fichier en utilisant un IIFE .
Si vous voulez définir une variable globale, n'écrivez simplement pas le var
, en donnant:
someVar = 'someValue';
Cela définira une variable dans toute votre application par défaut, bien que vous puissiez la restreindre en écrivant cette déclaration dans un dossier reconnu spécifique à (client
ou server
dossier pour exemple).
Cependant, cette variable ne sera pas définie absolument en premier. Il sera défini lorsque Meteor exécute le code réel qui le définit. Ainsi, ce n'est peut-être pas la meilleure pratique car vous allez avoir du mal avec l'ordre de chargement, et cela rendra votre code dépendant de la façon dont Meteor charge les fichiers: dans quel dossier vous mettez le fichier, le nom du fichier... Votre code est sujet à des erreurs désordonnées si vous touchez légèrement votre architecture.
Comme je l'ai suggéré dans un autre de près related post, vous devriez aller pour un paquet directement!
Les Variables
Dans Meteor déclarées avec le mot clé var
sont étendues au fichier dans lequel elles sont déclarées.
Si vous voulez créer une variable globale, faites ceci
Schemas = {}
ReferenceError est une erreur de nœud. Meteor est un framework au-dessus du nœud.
Le nœud a une portée globale (aka variable global
du nœud). cette erreur est déclenchée par Node (pas Meteor) si vous essayez d'accéder à une variable globale indéfinie.
Les navigateurs ont également une portée globale appelée window
et ne lancent pas ReferenceErrors lorsque des variables non définies sont accédées.
Voici un modèle que j'aime pour ajouter des fonctionnalités à une classe (c'est très Meteor):
/lib/Helpers.js <-- Helpers for everyone (node+browser)
/server/Helpers.js <-- Server helpers (node)
/client/Helpers.js <-- Client helpers (browser)
Considérez ces implémentations:
// /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*/}
C'est un exemple trivial. Que faire si Je ne voulais pas m'inquiéter de l'ordre de chargement? Pourquoi pas _.extend() dans / lib / Helpers.js?
// /lib/Helpers.js
// Helpers = {/* functions */}; // Overwrites...
Helpers = _.extend(Helpers, {/* functions */}); // ReferenceError
Parce que vous obtiendrez une ReferenceError de Node si Helpers n'est pas défini-en particulier les "Helpers" utilisés comme argument. (Node sait assigner des assistants comme global.Helper).
Voici deux façons de "réparer" cette:
1) affecter des assistants à quelque chose
// /lib/Helpers.js
// Helpers = Helpers || {} // would be another ReferenceError
if (typeof Helpers === 'undefined') Helpers = {};
Helpers = _.extend(Helpers, {/* functions */});
2) Utilisez les aides du global
// /lib/Helpers.js
Helpers = _.extend(global.Helpers, {/* functions */}); // works in node, but...
Les deux sont nuls.
La syntaxe de1) est horrible.
2) fonctionne dans le nœud, mais il n'y a pas de global dans les navigateurs. Si elle échoue, c'est le but.
J'ai donc abandonné et je suis retourné à l'écraser la première fois dans lib, et à la recherche d'erreurs d'exécution si quelque chose était écrasé.
Si vous avez une syntaxe cross-browser pratique pour cela, faites un commentaire :-) var = quelque chose de quelque chose || {} quelque.bla = toto;
Voici quelques autres conseils de raccourci JS .
Les variables de Session sont globales et sont facilement accessibles dans différents fichiers / fonctions. Session.setPersistent est utilisé pour définir le nom de la variable de manière persistante dans tous les fichiers. On peut restreindre l'utilisation de variables de session lorsque leur application est trop grande car elles ne sont pas supprimées (d'où des fuites de mémoire possibles) et peuvent donner une erreur dans la console (si elle n'est pas définie). Lien vers les documents: https://docs.meteor.com/api/session.html