4

所以我不确定这条线是做什么的

      obj.on(name, typeof name === 'object' ? this : callback, this);

在listenTo 的Backbone.js 实现中。我也明白,listenTo 是一种让一个对象在另一个对象响应事件时采取行动的方式,我还看到 Backbone 网站说使用 listenTo 的优点是,如果我破坏原始对象,那么其他事件作用于可以删除其他对象。在listenTo中是如何实现的?

谢谢

4

1 回答 1

4

这是 的函数签名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. 这就是为什么listenTothis对象作为回调传递,这使它成为事件处理程序的上下文。

listenTo是一种相当新的方法,所以我假设这就是变量名没有意义的原因。


当视图被移除时——可能是在模型被删除之后——该remove方法调用stopListening视图。off如果您不向它传递任何参数,该函数只会调用所有处理程序:

for (var id in listeners) {
    listeners[id].off(null, null, this);
}
于 2013-02-28T21:03:47.413 回答