9

如果 collectionA 和 collectionB 都触发了“同步”事件,我想运行 view.render()。像这样的东西。

collectionA = new CollectionA();
collectionB = new CollectionB();

view.listenTo([collectionA, collectionB], 'sync', view.render);

collectionA.fetch(); // do not call view.render yet.
collectionB.fetch(): // call view.render after fetch.

我知道有一种方法可以像这个答案一样使用 $.when() 或 _.after() 。 如何同步多个 Backbone.js 获取?

但我认为这些都不是事件驱动的方式。Backbone.js 上是否有任何事件驱动的方式?

4

1 回答 1

10

您可以使用下划线after方法的组合,仅在回调被多次调用时执行回调,并Backbone.Events.once确保您不会过早触发处理程序,如果其中一个集合触发两个sync事件,而不是每个触发一个事件:

var callback = _.after(2, view.render);
collectionA.once('sync', callback, view);
collectionB.once('sync', callback, view);

或者你可以将逻辑包装到一个实用函数中,这样你就可以将它与可变数量的事件源一起使用:

function onceAll(eventSources, eventName, handler, context) {
  handler = _.after(eventSources.length, handler);
  context = context || this;
  _.each(eventSources, function(source) {
      source.once(eventName, handler, context);
  });
}

用法:

onceAll([collectionA, collectionB], 'sync', view.render, view);

/未经测试的代码示例。

于 2013-04-16T10:37:38.087 回答