2013-04-16 11 views
9

Chciałbym uruchomić view.render(), jeśli zarówno collectionA, jak i collectionB wywołały zdarzenie "sync". Coś takiego.Czy istnieje sposób oczekiwania na wywołanie oddzwonienia, dopóki nie zsynchronizowano kolekcji wielu szkieletów?

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. 

wiem, że jest to sposób na wykorzystanie $ .Przy() lub _.after(), tak jak to jest odpowiedź. How to synchronize multiple Backbone.js fetches?

Ale myślę, że nie są one oparte na zdarzeniach. Czy na Backbone.js istnieje sposób sterowany zdarzeniami?

Odpowiedz

10

Można użyć kombinacji podkreślenia jest after metody tylko wykonać zwrotnego, kiedy to został powołany kilka razy, a Backbone.Events.once aby upewnić się, że nie wywoła obsługi przedwcześnie, jeśli jedna ze zbiorów wystrzeliwuje dwa sync wydarzenia zamiast po jednym z każdego:

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

można też owinąć logikę do funkcji użytkowych, dzięki czemu można go używać ze zmiennej liczby źródeł zdarzenia:

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

Zastosowanie:

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

/Nie przetestowane próbki kodu.

Powiązane problemy