2013-04-16 12 views
9

Mi piacerebbe eseguire view.render() se sia collectionA che collectionB hanno attivato l'evento 'sync'. Qualcosa di simile.C'è un modo per aspettare di richiamare la richiamata fino a quando non sono sincronizzate più raccolte di backbone?

So che esiste un modo per utilizzare $ .when() o _.after() come questa risposta. How to synchronize multiple Backbone.js fetches?

Ma penso che questi non siano un modo guidato dagli eventi. Esiste un modo guidato dagli eventi su Backbone.js?

risposta

10

È possibile utilizzare una combinazione del metodo di sottolineatura after per eseguire solo la richiamata quando è stato chiamato un certo numero di volte, e Backbone.Events.once per garantire che non si attivano il gestore prematuramente, se una delle collezioni spara due sync eventi , invece di uno per ogni:

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

Oppure si può avvolgere la logica in una funzione di utilità, in modo da poter utilizzare con un numero variabile di origini eventi:

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

Usage:

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

/Codice campioni non testati.

Problemi correlati