2013-08-09 16 views
5

Proste pytanie: Jaki jest najlepszy sposób na ogień zdarzenia „tylko raz”?Backbone: wypalanie zdarzenie tylko raz na zbiór „zmiany”

Mam kolekcję w sieci szkieletowej z wielu modeli. Czasami atrybuty wielu modeli są aktualizowane od razu, uruchamiając wiele zdarzeń "zmian" w Kolekcji.

Jaki jest najlepszy sposób na ogień zdarzenia „change” tylko raz, grupowanie wszystkich atrybut zmienia się razem?

Mój najlepszy pomysł w tej chwili jest za pomocą timera, ale będzie to tylko pierwszy uchwycić zmianę atrybutów modelu.

Wszelkie sugestie, pomysły i rozwiązania są cenione. Dziękuję Ci :).


Kontekst: W tym przypadku zdarzenie pożary bardzo obliczeniowo funkcji, dlatego wiele tras należy unikać.

Odpowiedz

4

Gdy aktualizujesz atrybuty dotyczące modeli luzem, przechodzą {silent:true} jako opcja, która will suppress any events from being fired.

Następnie spust zwyczaj wydarzenie, dla których widok lub wiele widoków słuchanie tego samego.

+3

To raczej obejście, a nie poprawne rozwiązanie. Lepszym rozwiązaniem byłoby użycie 'reset' zamiast' add'. Zostanie wywołane pojedyncze zdarzenie "reset". –

2

Można „nieczułości” metoda w swojej kolekcji, która reaguje na zmianę wydarzeń, choć będziesz musiał ręcznie dowiedzieć się, które modele zmianie:

Col = Backbone.Collection.extend({ 
    modelChanged: _.debounce(function() { 
     // handle model changes 
    }, delayInMs), 
    initialize: function() { 
     this.collection.on('change', this.modelChanged, this); 
    } 
}) 
2

Można spróbować resetowania kolekcji, zamiast dodawania elementy. Zobacz Collection reset method description:

zresetowaćcollection.reset([models], [options])

Dodawanie i usuwanie modeli jeden naraz wszystko jest dobrze, ale czasem trzeba tak wiele modeli to zmienić wolisz po prostu zaktualizować kolekcję w objętość. Użyj reset, aby zastąpić kolekcję nową listą modeli (lub skrótów atrybutów), uruchamiając pojedyncze zdarzenie "reset" na końcu. Zwraca nowo ustawione modele. Dla wygody, w przypadku zdarzenia "reset", lista poprzednich modeli jest dostępna jako options.previousModels.

jako dokumentacja mówi, jeśli używasz reset, zamiast add dostaniesz jeden reset wydarzenie w końcu.

+1

pamiętaj, że 'fetch()' w kolekcji nadal generuje zdarzenia zmian dla każdego modelu zmienionego, chyba że w opcjach wprowadzisz '{reset: true}'. – mix3d

Powiązane problemy