所以我不确定这条线是做什么的
obj.on(name, typeof name === 'object' ? this : callback, this);
在listenTo 的Backbone.js 实现中。我也明白,listenTo 是一种让一个对象在另一个对象响应事件时采取行动的方式,我还看到 Backbone 网站说使用 listenTo 的优点是,如果我破坏原始对象,那么其他事件作用于可以删除其他对象。在listenTo中是如何实现的?
谢谢
所以我不确定这条线是做什么的
obj.on(name, typeof name === 'object' ? this : callback, this);
在listenTo 的Backbone.js 实现中。我也明白,listenTo 是一种让一个对象在另一个对象响应事件时采取行动的方式,我还看到 Backbone 网站说使用 listenTo 的优点是,如果我破坏原始对象,那么其他事件作用于可以删除其他对象。在listenTo中是如何实现的?
谢谢
这是 的函数签名on
:
object.on(事件,回调,[上下文])
event
是像“click”这样的事件名称或像这样的事件映射:
{
'click .button': 'handler1',
'keydown': function(){}
}
因此,在listenTo
您发布的代码中,第一个参数是事件名称或事件映射。如果它是事件名称(类型“字符串”),您希望将指定的回调作为第二个参数传递给 on。如果name
是一个事件映射(类型“对象”) 骨干传递this
- 它最终将用作上下文,即使它是作为回调传递的。
看看这个eventsApi
函数以及它是如何被调用的on
:
function(obj, action, name, rest) {
if (!name) return true;
if (typeof name === 'object') {
for (var key in name) {
obj[action].apply(obj, [key, name[key]].concat(rest));
}
}
// ... code in `on`:
eventsApi(this, 'on', name, [callback, context]) && callback)
假设name
是一个事件映射(因此typeof name ==='object'
是真的)。on
对于我们使用以下参数调用的事件映射的每个成员: [key, name[key]].concat(rest)
. 因为rest
是[callback, context]
我们得到四个参数。
但这比on
接受的要多 - 最后一个需要是上下文,而不是callback
. 这就是为什么listenTo
将this
对象作为回调传递,这使它成为事件处理程序的上下文。
listenTo
是一种相当新的方法,所以我假设这就是变量名没有意义的原因。
当视图被移除时——可能是在模型被删除之后——该remove
方法调用stopListening
视图。off
如果您不向它传递任何参数,该函数只会调用所有处理程序:
for (var id in listeners) {
listeners[id].off(null, null, this);
}