我正在查看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

contextctx分开存储的原因是因为它们可以是不同的值。 context始终是传递给on的第三个值,它可以为null或未定义,而ctx是该值(如果可用)或this

07-26 00:07
查看更多