所以我不确定这行是做什么的
obj.on(name, typeof name === 'object' ? this : callback, this);
在ListenTo的Backbone.js实现中。我还了解到listenTo是一种使一个对象在另一个对象响应事件时 Action 的方法,并且我还看到Backbone网站说,使用listenTo的好处是,如果我销毁原始对象,则其他事件将作用于该对象。其他对象可以删除。在listenTo中如何实现呢?
谢谢
最佳答案
这是 on
的功能签名:
event
是事件名称(例如“click”)或事件映射,如下所示:
{
'click .button': 'handler1',
'keydown': function(){}
}
因此,在您发布的
listenTo
代码内部,第一个参数是事件名称或事件映射。如果它是事件名称(类型为“字符串”),则要传递指定的回调作为第二个参数。如果name
是事件映射(类型“对象”),则Backbone会传递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'
为true)。对于事件映射的每个成员,我们使用以下参数调用on
:[key, name[key]].concat(rest)
。由于rest
是[callback, context]
,我们得到了四个参数。但这比
on
接受的还多-最后一个需要是上下文,而不是callback
。这就是listenTo
将this
对象作为回调传递的原因,这使它成为事件处理程序的上下文。listenTo
是一个相当新的方法,因此我假设这就是变量名没有意义的原因。当删除 View 时(可能是在删除模型之后),
remove
方法在 View 上调用stopListening
。如果您不传递任何参数,则该函数仅在所有处理程序上调用off
:for (var id in listeners) {
listeners[id].off(null, null, this);
}