在Meteor.js中将变量范围设置为模板

时间:2013-11-21 19:21:13

标签: javascript node.js meteor

是否可以创建一个作用于模板的变量?此变量可以在模板中的不同帮助程序之间共享,但不存在于模板外部。

在下面的这个例子中,如何在不重复定义的情况下在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';
};

5 个答案:

答案 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}}并按上述方式编辑其值。