我正在查看source of backbone,事件部分,除了上下文存储两次的行外,大部分都是有意义的。
在一种情况下,它获取传递给on()
的值。在第二个实例中,它获取传递的值,但如果没有传递,则获取当前上下文 - this
。
on: function(name, callback, context) {
if (!(eventsApi(this, 'on', name, [callback, context]) && callback)) return this;
this._events || (this._events = {});
var list = this._events[name] || (this._events[name] = []);
list.push({callback: callback, context: context, ctx: context || this}); // here
return this;
},
令人困惑的一件事是,有时this._events[name]
会保存到本地变量list
(开启和关闭),有时会将其保存到本地变量effects
(触发器)。< / p>
明确使用每个
.ctx
用于triggerEvents()
。.context
用于off()
。答案 0 :(得分:3)
ctx
用作回调函数内this
的值。例如,在视图的initialize
方法中,您可以执行此操作:
this.model.on('change', this.render, this); // where 'this' is the view
然后在render方法中,当触发该事件时,this
将成为视图。
context
以便off
的某些用法可以正常工作,为您提供更多方法来有选择地删除事件回调。例如,如果您想删除上例中添加到模型的回调,您可以这样做:
this.model.off(null, null, this); // where 'this' is the view from above
这将删除添加到该模型的任何事件处理程序,其中视图作为上下文传递。
该行不会删除添加的事件,如:
this.model.on('change', this.foo, bar); // context is bar
如果您连接多个事件并希望一次删除所有事件,而不删除添加了不同上下文的任何回调,则可能很有用。但是,现在事件已listenTo
,因此可能更容易使用它,因为视图只能调用stopListening
。
context
和ctx
分开存储的原因是因为它们可以是不同的值。 context
始终是传递给on
的第三个值,可能为null或未定义,而ctx
是该值(如果可用)或this
。