是否可以创建一个作用于模板的变量?此变量可以在模板中的不同帮助程序之间共享,但不存在于模板外部。
在下面的这个例子中,如何在不重复定义的情况下在2个模板之间共享game
变量?使用var
初始化它会使它全局化,这不是我想要的。谢谢!
Template.userInfo.game = function() {
var game = 'Angry Bird';
return game + ' game';
};
Template.userInfo.score = function() {
var game = 'Angry Bird';
return game + ' score';
};
答案 0 :(得分:7)
如果其他人偶然发现并使用Meteor 1.0,那么您可以通过以下方式实现此目标。
Template.name.onCreated(function(){
this.data.variableName = "something";
});
Template.name.helpers({
'helper' : function() {
return Template.instance().data.variableName;
}
});
这样,变量的范围限定为创建的模板的实例。我有一个页面使用相同模板的多个实例,所以这非常有用。
编辑:
所以这适用于嵌套在另一个模板中的模板,但是对于父模板不能很好地工作。 data
属性未保留值,因此我进行了一些研究,并在Template.onCreated
的示例中找到了this他们this.highlightedPicture = new ReactiveVar(null);
所以显然可以定义新属性你的模板实例。我在两种情况下都尝试了这种方法,它适用于Template.instance()
。
答案 1 :(得分:3)
为什么不使用
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()
包装来获得私有的反应模板变量
答案 2 :(得分:2)
来自文档:http://docs.meteor.com/#namespacing
只需用var声明它,它就是文件范围。没有var,它将成为全球范围。
var game = 'Angry Bird'; // File scope.
game2 = 'Angry Bird'; // App scope.
答案 3 :(得分:0)
我在使用 autorun 和变量范围时遇到了一些问题,所以它可能对某人有所帮助:
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());
});
答案 4 :(得分:0)
您可以在onCreated
中将其创建为响应式var,然后在帮助器中返回该变量。无论您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}}
并按上述方式编辑其值。