0

我正在查看主干的来源,事件部分,并且在大多数情况下它是有意义的,除了上下文存储两次的行。

在一种情况下,它获取传递给的值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().
4

1 回答 1

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

如果您连接到多个事件并希望一次将它们全部删除,而不删除任何使用不同上下文添加的回调,这可能会很有用。但是,既然 Events 有listenTo,使用它可能更容易,因为视图可以只调用stopListening.

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

于 2013-03-14T20:08:14.290 回答