Meteor 什么';Template.Instance()和Template.data之间的区别是什么?

Meteor 什么';Template.Instance()和Template.data之间的区别是什么?,meteor,Meteor,当创建流星事件处理程序时,以下两者之间的区别是什么 'click .something': function(e,t){ var data = t.data } vs 他们两人似乎提出了相同的数据。有什么理由我应该选择其中一个吗?它实际上是Template.instance()(具有较低的I),由于此函数返回范围中的当前模板实例(事件发生的地方),因此与事件处理程序的第二个参数没有区别,该参数也保存当前模板实例,这就是为什么您可以在事件处理程序中使用template.instance(

当创建流星事件处理程序时,以下两者之间的区别是什么

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


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

它实际上是
Template.instance()
(具有较低的I),由于此函数返回范围中的当前模板实例(事件发生的地方),因此与事件处理程序的第二个参数没有区别,该参数也保存当前模板实例,这就是为什么您可以在事件处理程序中使用
template.instance().data
t.data
无差别地访问模板数据

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

类似问题如下:

要认识到的是:

在模板生命周期函数中(onCreate,onRendered…)
等于
template.instance()
因此
此.data
与当时的
template.instance().data
相同

在助手或事件中,
是当前的数据上下文

因此,这里需要注意一件重要的事情:如果您的数据在上游发生变化,那么数据上下文会随着时间的推移而变化:

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

所以,如果你做了如下事情:

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.myKey
)中的
this
(即数据上下文)下,但前提是上游数据不变

一旦上游数据发生更改,
将成为新的数据上下文,并且不包含您添加的数据

因此,总而言之:

如果需要在
onCreated
onRendered
中向模板添加上下文,请确保不将其绑定到当前数据上下文,而是绑定到模板。实例()

你应该做:

Template.example.onCreated(function() {
   this.myKey = "my example data set on template creation"; 
   // or equivalently:
   Template.instance().myOtherKey = "another key"; 
})
您可以通过访问helper和events中的这些数据


Template.instance().myKey

Template.instance
目前仅在助手中有用。在其他地方(如
创建的
回调、
呈现的
回调等),您可以通过其他方式获取模板实例,但在这些情况下,您也可以使用
template.instance
,如果您愿意的话。请注意,正如我在下面的回答中所述,您可以通过这种方式访问template.instance()数据,您不应该将自己的数据放在这个上下文中,否则它可能会在下一个模板呈现时消失。
Template.example.onCreated(function() {
   this.myKey = "my example data set on template creation"; 
   // or equivalently:
   Template.instance().myOtherKey = "another key"; 
})