2

从概念上讲,eventsApi()做什么?它是Backbone私有的,但用于 4 个公共事件方法 - on()once()off()trigger().

在每一个中,如果它返回一个非真实值,则调用它的方法将“提前”退出。

它做的一件事是确定调用方法的第二部分是否会执行。如果name不是真实的或不是复杂类型(对象或空格分隔的字符串),它将返回一个 true 允许该方法的第二部分运行。

从概念上讲,该功能的主要目的是什么eventsApi,因为我试图描述它在功能/逻辑上的作用?

事件API

  var eventsApi = 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));
      }
    } else if (eventSplitter.test(name)) {
      var names = name.split(eventSplitter);
      for (var i = 0, l = names.length; i < l; i++) {
        obj[action].apply(obj, [names[i]].concat(rest));
      }
    } else {
      return true;
    }
  };
4

1 回答 1

1

就像源代码中的评论所说,它实现了事件 API 的更多奇特用途。

// Implement fancy features of the Events API such as multiple event
// names `"change blur"` and jQuery-style event maps `{change: action}`
// in terms of the existing API.

因此,当您将事件 API 与事件映射一起使用时:

book.on({
  "change:title": titleView.update,
  "change:author": authorPane.update,
  "destroy": bookView.remove
});

eventsApi函数检测到输入是一个对象,并on为传入的每个属性再次调用。

它处理的另一种情况是空格分隔的事件:

book.on("change:title change:author", ...);

在这种情况下,eventsApi函数会检测到这种情况,并再次为传入的每个事件调用on一次。

于 2013-03-13T21:10:11.433 回答