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

      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。这就是listenTothis对象作为回调传递的原因,这使它成为事件处理程序的上下文。
listenTo是一个相当新的方法,因此我假设这就是变量名没有意义的原因。

当删除 View 时(可能是在删除模型之后),remove方法在 View 上调用stopListening。如果您不传递任何参数,则该函数仅在所有处理程序上调用off:
for (var id in listeners) {
    listeners[id].off(null, null, this);
}

08-26 22:46