事件 - 为什么上下文存储有两种不同的方式?

时间:2013-03-14 19:39:33

标签: javascript backbone.js

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

1 个答案:

答案 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

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