如果collectionA和collectionB都触发了'sync'事件,我想运行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()这样的答案。 How to synchronize multiple Backbone.js fetches?
但我认为这些不是事件驱动的方式。 Backbone.js上有任何事件驱动方式吗?
答案 0 :(得分: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);
/代码样本未经测试。