2013-04-16 3 views
9

Ich möchte view.render() ausführen, wenn sowohl collectionA als auch collectionB das Ereignis 'sync' ausgelöst haben. So etwas wie das.Gibt es eine Möglichkeit zu warten, Callback aufzurufen, bis mehrere Backbone-Sammlung synchronisiert wurde?

Ich weiß, es gibt eine Möglichkeit, $ .when() oder _.after() zu verwenden, wie dies beantwortet. How to synchronize multiple Backbone.js fetches?

Aber ich denke, das sind keine ereignisgesteuerten Weg. Gibt es einen ereignisgesteuerten Weg auf Backbone.js?

Antwort

10

Sie after Verfahren eine Kombination aus Strich des verwenden können, um nur den Rückruf ausgeführt wird, wenn es eine Reihe von Zeiten genannt wurde, und Backbone.Events.once, um sicherzustellen, dass Sie nicht den Handler vorzeitig tun auslösen, wenn eine der Sammlungen feuert zwei sync Veranstaltungen statt eine Gruppe aus jeweils:

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

Oder Sie können die Logik in eine Nutzenfunktion wickeln, so dass Sie es mit einer variablen Anzahl von Ereignisquellen verwenden:

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

Verbrauch:

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

/Codebeispiele nicht getestet.

Verwandte Themen