我正在查看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
(触发)。各自的明确使用
.ctx
用于triggerEvents()
。.context
用于off()
。 最佳答案
触发事件时,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
。