所以我不确定这一行是做什么的
obj.on(name, typeof name === 'object' ? this : callback, this);
在 listenTo 的 Backbone.js 实现中。我也明白 listenTo 是一种让一个对象在另一个对象响应事件时起作用的方法,我还看到 Backbone 网站说使用 listenTo 的优点是如果我销毁原始对象,那么其他事件就会作用于该对象可以删除其他对象。这在 listenTo 中又是如何实现的?
谢谢
最佳答案
这是on
的函数签名:
object.on(event, callback, [context])
event
是一个像“click”这样的事件名称或者像这样的事件映射:
{
'click .button': 'handler1',
'keydown': function(){}
}
因此在您发布的 listenTo
代码中,第一个参数是事件名称或事件映射。如果它是事件名称(类型为“字符串”),您希望将指定的回调作为第二个参数传递给 on。如果 name
是事件映射(类型为“object”),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'
为真)。对于事件映射的每个成员,我们使用以下参数调用 on
:[key, name[key]].concat(rest)
。因为 rest
是 [callback, context]
我们得到四个参数。
但这比 on
接受的多了一个 - 最后一个需要是上下文,而不是 回调
。这就是为什么 listenTo
将 this
对象作为回调传递,使其成为事件处理程序的上下文。
listenTo
是一种相当新的方法,所以我假设这就是变量名称没有意义的原因。
当一个 View 被删除时——可能是在删除模型之后——remove
方法调用 View 上的stopListening
。如果您不向它传递任何参数,该函数只会在所有处理程序上调用 off
:
for (var id in listeners) {
listeners[id].off(null, null, this);
}
关于javascript - ListenTo在Backbone中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133762/