2014-12-16 9 views
25

У меня естьГлобальные переменные в Метеоре

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 
    } 
}); 

в одном файле и

var Collections = {}; 

Meteor.isClient && Template.registerHelper("Collections", Collections); 

Persons = Collections.Persons = new Mongo.Collection("Persons"); 
Persons.attachSchema(Schemas.Person); 

в другом файле.

Я получаю ошибку ReferenceError: Schemas is not defined. Совершенно очевидно, что я должен определить Schemas в моем файле collections.js вместо того, чтобы иметь их отдельно. Но как Meteor работает с кодом в отдельных файлах? Я могу получить доступ к некоторым объектам и переменным, а другие недоступны.

+0

является 'Schemas' глобальной переменной? загружаете ли вы его с помощью 'require'? возможно, вам нужно показать нам больше кода, потому что, поскольку код написан, не должно быть проблем –

+3

Возможный дубликат [Как я могу получить доступ к константам в файле lib/constants.js в Meteor?] (http://stackoverflow.com/ Вопросы/26836390/how-can-i-access-constants-in-the-lib-constants-js-file-in-meteor) –

ответ

53

При определении переменного в классическом способе JavaScript:

var someVar = 'someValue'; 

в корне файла .js Метеор прицелы его в файл, используя IIFE.

Если вы хотите, чтобы определить глобальную переменную, просто не написать var, давая:

someVar = 'someValue'; 

Это будет определять переменную во всех приложения по умолчанию, хотя вы можете ограничить его в письменной форме, что декларация в каталоге specific recognized folder (client или server).

Однако эта переменная не будет определена в первую очередь. Он будет определен, когда Meteor запускает фактический код, который его определяет. Таким образом, это может быть не самая лучшая практика, потому что вы будете бороться с порядком загрузки, и это сделает ваш код зависимым от того, как Meteor loads files: в какую папку вы вставляете файл, имя файла ... Ваш код склонны к беспорядочным ошибкам, если вы слегка коснитесь своей архитектуры.

Как я и предложил в another closely related post, вы должны пойти на пакет напрямую!

+0

Я пытаюсь определить свои глобальные переменные в каталоге lib, но пакеты определенно более надежны – CleoR

+3

I 'd хотел бы добавить, что это действительно здорово, потому что у вас может быть файл constants.js в вашем/клиенте, а другой - в ваших/серверных каталогах. И если вы хотите поделиться файлом констант между обоими, вы можете создать его в/lib/константах. –

+0

Это не проблема Метеор. См. Ниже ReferenceError. –

11

Переменные в Метеоре объявлены с ключевым словом var находятся в области видимости в файл они объявлены.

Если вы хотите создать глобальную переменную сделать это

Schemas = {} 
+3

Я не уверен, как я к этому отношусь ... нет ли способа ES6/webpack-стиля для импорта переменных из другого файла, чтобы я мог избежать глобальных? – Andy

2

ReferenceError ошибка узла. Метеор - это каркас на вершине Узла.

Узел имеет глобальную область действия (переменная global). Эта ошибка вызывается Node (not Meteor), если вы пытаетесь получить доступ к неопределенной глобальной переменной.

Браузеры также имеют глобальную область действия, называемую window, и не бросают ReferenceErrors при доступе к неопределенным переменным.

Вот образец, который я хотел для добавления функциональности к классу (это очень Метеор):

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

Рассмотрим эти реализации:

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

Это тривиальный пример.Что, если я не хочу беспокоиться о порядке загрузки? Почему не _.extend() в /lib/Helpers.js?

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

Потому что вы получите ReferenceError от узла, если Помощники не определены - в частности, «Помощники», используемые в качестве аргумента. (Узел знает, как назначить помощников как global.Helpers).

Вот два способа "исправить" это:

1) Присвоить хелперов к чему-то

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

2) Использование помощников из глобального

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

Оба которые сосут.

1) Синтаксис является ужасным.
2) работает в узле, но глобальных браузеров нет. Так что это не так.

Итак, я сдался и вернулся, чтобы перезаписать его в первый раз в lib и искать ошибки времени выполнения, если что-то было перезаписано.

Если у вас есть удобный кросс-браузерный синтаксис для этого, сделайте комментарий :-) var something = something || {} something.blah = foo;

Вот некоторые другие JS shorthand tips.

+0

Обратите внимание, что третья часть кода должна быть добавлена ​​в начале каждого файла, который должен использовать глобальную переменную, для каждой используемой переменной. –

+1

Не могли бы вы объяснить, почему вы ссылались на ES6 и как это относится к вопросу? – Fletch

+0

@Fletch umm ... фактически нет. Поэтому я удалил его. По какой-то причине я думал, что модули ES6 собираются помочь очистить глобальное пространство имен, но я ничего не могу найти об этом: - / –

0

Переменные сеанса являются глобальными и могут быть легко доступны в разных файлах/функциях. Session.setPersistent используется для постоянного определения имени переменной во всех файлах. Можно ограничиться использованием переменных сеанса, когда их приложение слишком велико, поскольку они не удаляются и могут вызывать ошибку в консоли. Ссылка на документы: https://docs.meteor.com/api/session.html

Смежные вопросы