创建Meteor事件处理程序时,......
之间有什么区别'click .something': function(e,t){
var data = t.data
}
VS
'click .something': function(e,t){
var data = Template.instance().data
}
他们似乎都提出了相同的数据。有什么理由我应该选择其中一个吗?
答案 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
将成为新的数据上下文,并且不会包含您添加的数据。
所以,总结一下:
如果您需要在onCreated
或onRendered
中为模板添加上下文,请确保不将其绑定到当前数据上下文,而是绑定到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().data
或t.data
无差别地访问模板数据的原因。
然而,有一种更简单的方法可以访问事件处理程序中的当前数据上下文:this
对象绑定到触发事件的数据上下文。