在Backbone中实现ListenTo

时间:2013-02-28 10:59:14

标签: javascript backbone.js

所以我不确定这行是什么

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

在listenTo的Backbone.js实现中。我也理解listenTo是一种让一个对象在另一个对象响应事件时起作用的方式我也看到Backbone网站说使用listenTo的优点是如果我销毁原始对象然后其他事件作用于其他对象可以删除。如何在listenTo中实现?

由于

1 个答案:

答案 0 :(得分:4)

这是on的函数签名:

  

object.on(event,callback,[context])

event可以是“点击”之类的事件名称,也可以是这样的事件地图:

{
    'click .button': 'handler1',
    'keydown': function(){}
}

因此,在您发布的listenTo代码中,第一个参数是事件名称或事件映射。如果它是一个事件名称(类型为“string”),您希望将指定的回调作为第二个参数传递给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接受的要多一个 - 最后一个需要是上下文,而不是callback。这就是为什么listenTothis对象作为回调传递的原因,这使得它成为事件处理程序的上下文。

listenTo是一个相当新的方法,所以我假设这就是为什么变量名没有意义。


删除视图时 - 可能在删除模型后 - remove方法在视图上调用stopListening。该函数只是在所有处理程序上调用off,如果你没有传递任何参数:

for (var id in listeners) {
    listeners[id].off(null, null, this);
}