Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件-为什么上下文以两种不同的方式存储?_Javascript_Backbone.js - Fatal编程技术网

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;
},