web-dev-qa-db-fra.com

Variables globales dans Meteor

J'ai

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.

J'obtiens l'erreur ReferenceError: Schemas is not defined. Il est assez évident que je dois définir Schemas dans mon collections.js fichier au lieu de les séparer. Mais comment Meteor fonctionne-t-il avec le code dans des fichiers séparés? Je peux accéder à certains objets et variables tandis que d'autres sont inaccessibles.

28
Jamgreen

Lorsque vous définissez une variable de la manière JavaScript classique:

var someVar = 'someValue';

à la racine de votre .js fichier Meteor l'étend au fichier à l'aide d'un IIFE .

Si vous voulez définir une variable globale, n'écrivez simplement pas le var, donnant:

someVar = 'someValue';

Ceci 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 dossier reconnu spécifique (client ou server par exemple ).

Cependant, cette variable ne sera pas définie absolument en premier. Il sera défini lorsque Meteor exécutera 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 salissantes si vous touchez légèrement votre architecture.

Comme je l'ai suggéré dans n autre poste étroitement lié vous devriez opter pour un package directement!

57
Paul Stenne

Les variables de Meteor déclarées avec le mot clé var sont étendues au fichier dans lequel elles sont déclarées.

Si vous souhaitez créer une variable globale, procédez comme suit

Schemas = {}
11
Joshua Soileau

ReferenceError est une erreur Node. Meteor est un framework au dessus de Node.

Le nœud a une portée globale (la variable global de Node). Cette erreur est générée par Node (pas Meteor) si vous essayez d'accéder à une variable globale non définie.

Les navigateurs ont également une portée globale appelée window et ne lancent pas ReferenceErrors lorsque des variables non définies sont accessibles.

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*/}

Ceci est un exemple trivial. Et si je ne voulais pas me soucier 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 affecter des Helpers en tant que global.Helpers).

Voici deux façons de "corriger" ceci:

1) Attribuer des aides à quelque chose

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

2) Utilisez des assistants du monde entier

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

Les deux sont nuls.

La syntaxe de 1) est horrible.
2) fonctionne dans le nœud, mais il n'y a pas de global dans les navigateurs. Il échoue donc à son but.

J'ai donc abandonné et j'ai recommencé à l'écraser la première fois dans lib, et à chercher des erreurs d'exécution si quelque chose était écrasé.

Si vous avez une syntaxe multi-navigateur pratique pour cela, faites un commentaire :-) var quelque chose = quelque chose || {} quelque chose.blah = foo;

Voici quelques autres astuces JS .

3
Michael Cole

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 variable de manière persistante dans tous les fichiers. On pourrait restreindre l'utilisation de variables de session lorsque leur application est trop grande car elles ne sont pas supprimées (d'où d'éventuelles fuites de mémoire) et peut donner une erreur dans la console (si non définie ou ainsi). Lien vers les documents: https://docs.meteor.com/api/session.html

1
user3807691