2013-08-09 12 views
5

Einfache Frage: Was ist der beste Weg, eine Veranstaltung "nur einmal" zu feuern?Backbone: ein Ereignis nur einmal an einer Sammlung auslösen 'ändern'

Ich habe eine Sammlung im Backbone mit mehreren Modellen. Manchmal werden die Attribute mehrerer Modelle gleichzeitig aktualisiert, wodurch mehrere Änderungsereignisse in der Sammlung ausgelöst werden.

Was ist der beste Weg, das Ereignis 'change' nur einmal auszulösen und alle Attributänderungen zusammenzufassen?

Meine beste Idee im Moment ist die Verwendung eines Timers, aber dies wird nur die erste Attributänderung des Modells erfassen.

Alle Vorschläge, Ideen und Lösungen werden geschätzt. Vielen Dank :).


Kontext: In diesem Fall ist die Veranstaltung eine sehr rechenintensive Funktion löst daher mehrere Durchläufe müssen vermieden werden.

Antwort

4

Jedes Mal, wenn Sie die Attribute auf die Modelle in der Masse aktualisieren, {silent:true} als Option übergeben, die will suppress any events from being fired.

Dann Auslöser ein benutzerdefiniertes Ereignis, für die eine Ansicht oder mehrere Ansichten auf die gleiche hören.

+3

Dies ist eher ein Workaround, keine richtige Lösung. Eine bessere Lösung wäre "reset" statt "add". Ein einzelnes "Reset" -Ereignis wird aufgerufen. –

2

Sie können „Entprellen“ das Verfahren in Ihrer Sammlung, die Ereignisse zu ändern, reagiert, wenn Sie manuell haben werden, um herauszufinden, welche Modelle geändert:

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

Sie können versuchen, die Sammlung Zurücksetzen, anstatt das Hinzufügen die Elemente. Siehe Collection reset method description:

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

zurückgesetzt ein Hinzufügen und Entfernen von Modellen zu einer Zeit, alles ist schön und gut, aber manchmal muss man so viele Modelle zu ändern, dass Sie lieber nur die Sammlung aktualisieren in Masse. Verwenden Sie reset, um eine Sammlung durch eine neue Liste von Modellen (oder Attribut-Hashes) zu ersetzen, die am Ende ein einzelnes "reset" -Ereignis auslösen. Gibt die neu eingestellten Modelle zurück. Aus praktischen Gründen ist die Liste aller vorherigen Modelle innerhalb eines "reset" -Ereignisses als options.previousModels verfügbar.

Als Dokumentation sagt, wenn Sie reset verwenden, statt add Sie ein einzelnes reset Ereignis am Ende bekommen.

+1

Denken Sie daran, dass 'fetch()' für eine Sammlung immer noch Änderungsereignisse für jedes geänderte Modell generiert, es sei denn, Sie übergeben in den Optionen '{reset: true}'. – mix3d