Template.Instance()与template.data之间的区别是什么?

时间:2015-03-11 16:14:16

标签: meteor

创建Meteor事件处理程序时,......

之间有什么区别
'click .something': function(e,t){
    var data = t.data
}

VS

'click .something': function(e,t){
    var data = Template.instance().data
}

他们似乎都提出了相同的数据。有什么理由我应该选择其中一个吗?

2 个答案:

答案 0 :(得分:8)

这里有类似的问题:

Difference between Template.instance() and this

要意识到的是:

在模板生命周期函数中(onCreated,onRendered ...)this等于Template.instance()所以this.data与此时的Template.instance().data相同!

在帮助者或活动中,this是当前的数据背景

所以,请注意这里的重要事项:如果数据在上游发生变化,数据上下文可能会随时间发生变化:

如果将数据传递给模板,则将使用新数据重新呈现模板。新数据=新数据上下文。

所以,如果你做了类似的事情:

Template.example.onCreated(function() {
   this.data.myKey = "my example data set on template creation"; //WRONG!
   // or equivalently:
   Template.instance().data.myOtherKey = "another key"; //WRONG!
})

好吧,这个数据可能在你的助手(this)中的this.myKey(即数据上下文)下,但只要上游数据没有变化。

一旦上游数据发生变化,this将成为新的数据上下文,并且不会包含您添加的数据。

所以,总结一下:

如果您需要在onCreatedonRendered中为模板添加上下文,请确保不将其绑定到当前数据上下文,而是绑定到Template.instance()

你应该这样做:

Template.example.onCreated(function() {
   this.myKey = "my example data set on template creation"; 
   // or equivalently:
   Template.instance().myOtherKey = "another key"; 
})

您可以通过

在助手和事件中访问此数据

Template.instance().myKey

答案 1 :(得分:2)

它实际上是Template.instance()(具有较低的i),并且由于此函数返回范围中的当前模板实例(事件源自的那个),因此与事件处理程序的第二个参数没有区别,还保存当前模板实例,这就是您可以在事件处理程序中使用Template.instance().datat.data无差别地访问模板数据的原因。

然而,有一种更简单的方法可以访问事件处理程序中的当前数据上下文:this对象绑定到触发事件的数据上下文。