Template.Instance()与template.data有什么区别?

Mco*_*ope 5 meteor

在创建Meteor事件处理程序时,有什么区别......

'click .something': function(e,t){
    var data = t.data
}
Run Code Online (Sandbox Code Playgroud)

VS

'click .something': function(e,t){
    var data = Template.instance().data
}
Run Code Online (Sandbox Code Playgroud)

他们似乎都提出了相同的数据.我应该选择其中一个原因吗?

MrE*_*MrE 8

类似的问题:

Template.instance()和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!
})
Run Code Online (Sandbox Code Playgroud)

好吧,这个数据可能this在你的帮助程序(this.myKey)中(即数据上下文),但只有在上游数据不变的情况下.

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

所以,总结一下:

如果你需要的上下文添加到您的模板onCreated或者onRendered,请务必不要将其绑定到当前的数据范围内,但对Template.instance()

你应该做:

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

并且您可以通过帮助和事件访问此数据

Template.instance().myKey


sai*_*unt 2

实际上Template.instance()(i 较小),并且由于此函数返回范围内的当前模板实例(事件起源的实例),因此与事件处理程序的第二个参数没有区别,该参数也保存当前模板实例,这这就是为什么您可以使用事件处理程序Template.instance().datat.data在事件处理程序中访问模板数据。

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