2013-11-21 26 views
10

是否可以创建一个范围限定为模板的变量?该变量可以在模板中的不同助手之间共享,但不在模板之外。在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'; 
}; 

回答

2

从文档:http://docs.meteor.com/#namespacing

只是一个变种声明它,这将是文件的范围。没有这个变种,它将成为全球范围。

var game = 'Angry Bird'; // File scope. 
game2 = 'Angry Bird'; // App scope. 
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()以获得私人反应模板的变量

+0

助手将无法工作 - 助手具有全球范围。 – sbking

+0

啊,你说得对!我们没有办法将模板实例绑定到其任何帮助器上吗? – Roman

+0

这样做的方法是将参数从HTML传递给帮助器。所以,一旦你需要做这种事情,你应该把你的模型抽象成类。 – sbking

7

如果其他人绊倒了这一点,并使用流星1.0,以下是如何实现这一目标。

Template.name.onCreated(function(){ 
    this.data.variableName = "something"; 
}); 

Template.name.helpers({ 
    'helper' : function() { 
     return Template.instance().data.variableName; 
    } 
}); 

这样变量的范围就是创建的模板的实例。我有一个使用同一模板的多个实例的页面,所以这非常有用。

编辑:

所以这个工作完全嵌套另一个模板,模板内,但并没有与父模板工作这么好。 data属性没有值,所以我做了一些更多的研究,发现thisTemplate.onCreated的例子中,他们有this.highlightedPicture = new ReactiveVar(null);所以显然在你的Template实例上定义新的属性很好。我在两种情况下都尝试了这种方式,并且它与Template.instance()一起使用效果很好。

+0

'this.data'是[官方文档]只读的(http://docs.meteor.com/#/full/template_data)。 –

+1

嗨着色,我真的偶然发现了这一点(流星现在在1.2。1),并希望你有解决方案,但担心事情已经改变,或者你没有正确记录解决方案 - 基本上你需要删除所有对.data的引用,并将变量附加到模板本身 - 请参阅https: //dweldon.silvrback.com/scoped-reactivity了解如何使其工作的一个非常好的和容易消化的例子。 –

0

我有一些问题用自动运行和变量的作用域,所以也许这将帮助别人:

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

您可以创建其作为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}}并将其值编辑为上述值。