2013-04-16 14 views
9

我想运行view.render(),如果这两个collectionA和collectionB已经触发'同步'事件。 就是这样。有多种方式可以等到多个主干集合同步之后才能调用回调吗?

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有没有事件驱动的方式?

回答

10

您可以使用下划线的after方法仅执行回调的组合,当它被称为多次,并Backbone.Events.once,以确保您不会触发处理器过早,如果其中一个集合火灾2个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); 

/代码示例未测试。