Установите параметр переменной в шаблон в Meteor.js
Можно ли создать переменную, привязанную к шаблону? Эта переменная может быть разделена между различными помощниками в шаблоне, но не существует вне шаблона.
В этом примере ниже, как можно распределять переменную game
между двумя шаблонами без повторения ее определения? Инициализация с помощью var
делает его глобальным, что не то, что я хочу. Спасибо!
Template.userInfo.game = function() {
var game = 'Angry Bird';
return game + ' game';
};
Template.userInfo.score = function() {
var game = 'Angry Bird';
return game + ' score';
};
Ответы
Ответ 1
Если кто-то еще спотыкается об этом и использует Meteor 1.0, вот как вы можете это сделать.
Template.name.onCreated(function(){
this.data.variableName = "something";
});
Template.name.helpers({
'helper' : function() {
return Template.instance().data.variableName;
}
});
Таким образом, переменная привязана к экземпляру созданного шаблона. У меня есть страница, которая использует несколько экземпляров одного и того же шаблона, поэтому это было очень полезно.
EDIT:
Таким образом, это отлично работало для шаблонов, вложенных в другой шаблон, но не так хорошо работало с родительским шаблоном. Свойство data
не содержало значений, поэтому я сделал еще несколько исследований и нашел this в примере для Template.onCreated
, у них есть this.highlightedPicture = new ReactiveVar(null);
, поэтому, по-видимому, это нормально определите новые свойства в экземпляре Template. Я пробовал это в обоих сценариях, и он отлично работает с Template.instance()
.
Ответ 2
Почему бы не использовать
Template.foo.created = function() {
this._someVariable = "some value"
}
Template.foo.someHelper = function() {
return this._someVariable
}
Template.foo.events({
"click #mylink": function(event, tmpl) {
console.log(tmpl._someVariable)
}
})
Ваш частный _someVariable
не реагирует, он служит для опций в этом случае. Но вы можете обернуть Deps.Dependency()
, чтобы получить частные реактивные переменные Template
Ответ 3
Из документов: http://docs.meteor.com/#namespacing
Просто объявите его с помощью var, и это будет область файла. Без var это будет глобальная область.
var game = 'Angry Bird'; // File scope.
game2 = 'Angry Bird'; // App scope.
Ответ 4
У меня возникла проблема использования области автозапуска и переменной, поэтому, возможно, это поможет кому-то:
Template.foo.someHelper = function() {
return this._someVariable
}
Template.foo.events({
"click #mylink": function(event, tmpl) {
console.log(tmpl._someVariable)
}
})
Template.foo.onRendered(function() {
this._someVariable = "some value"
this.autorun(function(templateInstance) {
Collection.find({}).fetch(); // Autorun will be executed each time this collection has change (update, delete, insert)
console.log(templateInstance._someVariable);
}, this.templateInstance());
});
Ответ 5
Вы можете создать его как реактивный var в onCreated
, а затем вернуть эту переменную в помощнике. Везде, где вы set
, эта переменная автоматически обновит вспомогательное значение. Вот пример:
Template.foo.onCreated(function() {
this.yourVar = new ReactiveVar("");
this.yourVar.set("initValue");
});
Template.foo.helpers({
yourVar(){
return Template.instance().yourVar.get();
}
});
Template.foo.events({
'click .btn': function (event) {
template.yourVar.set($(event.target).val());
}
});
Теперь вы можете вызвать {{yourVar}}
в любом месте вашего шаблона и изменить его значение, как указано выше.