Javascript 事件-为什么上下文以两种不同的方式存储?
我正在浏览事件部分,在大多数情况下它是有意义的,除了上下文存储两次的那一行 在一种情况下,它获取传递给Javascript 事件-为什么上下文以两种不同的方式存储?,javascript,backbone.js,Javascript,Backbone.js,我正在浏览事件部分,在大多数情况下它是有意义的,除了上下文存储两次的那一行 在一种情况下,它获取传递给on()的值。在第二个实例中,它获取传递的值,但如果没有传递任何值,则获取当前上下文-this on: function(name, callback, context) { if (!(eventsApi(this, 'on', name, [callback, context]) && callback)) return this; this._events || (
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;
},
令人困惑的一件事是,有时这个。_事件[名称]
会保存到局部变量列表中(打开和关闭),而其他时候它会保存到局部变量效果中(触发器)
明确使用每个
.ctx
用于触发事件()
.context
用于off()
ctx
被用作触发事件时回调函数中该
的值。例如,在视图的initialize
方法中,可以执行以下操作:
this.model.on('change', this.render, this); // where 'this' is the view
然后在render方法中,当该事件被触发时,这将是视图
使用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
始终是在
上传递给的第三个值,它可以为null或未定义,而ctx
是该值(如果可用),或者this
ctx
在触发事件时用作回调函数中的this
的值。例如,在视图的initialize
方法中,可以执行以下操作:
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.model.on('change', this.render, this); // where 'this' is the view
然后在render方法中,当该事件被触发时,这将是视图
使用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
始终是在
上传递给的第三个值,它可以为null或未定义,而ctx
是该值(如果可用),或者此
需要注意的是,传递上下文不仅会更改回调中this
的值,还会更改事件的签名
。重要的是,传递上下文不仅会更改回调中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;
},