Backbone - Warum löst ein collection.reset kein Model Event aus?

7

Ich bin neugierig herauszufinden, warum das Zurücksetzen einer Backbone-Sammlung kein Modellereignis auslöst. Es erscheint jedoch nur logisch, ein Modellereignis auszulösen, wenn ein Modell physisch aus einer Sammlung entfernt wird.

Ist das beabsichtigt oder fehlt mir etwas? Wenn Backbone das nicht tut, ist es eine gute Übung, Ereignisse wie diese zu delegieren.

Warum löst das Rückgrat kein Modell-Ereignis aus, wenn seine Sammlung zurückgesetzt wird?

%Vor%     
nimrod 02.08.2012, 09:34
quelle

2 Antworten

16

Das Überschreiben der Backbone-Methode kann beim Aktualisieren auf eine andere Version zu Problemen führen.

Backbone speichert ein Array der Modelle vor dem Zurücksetzen in options.previousModels. Hören Sie also einfach auf das Reset-Ereignis und lösen Sie ein "remove" -Ereignis bei diesen vorherigen Modellen aus:

%Vor%

Das würde den Trick machen.

    
nimrod 08.02.2013, 17:19
quelle
16

Dies ist die Backbone-Reset-Funktion:

%Vor%

Wir können die letzten 3 Zeilen ignorieren, da Sie der Reset-Funktion keine Modelle zur Verfügung stellen. Lassen Sie uns auch die ersten beiden Zeilen ignorieren. Also durchlaufen wir zuerst die Modelle in dieser Sammlung und rufen die _removeReference(model) -Methode der Sammlung auf, die so aussieht:

%Vor%

In diesem Fall entfernen wir die sammlung -Eigenschaft aus dem Modellobjekt und entfernen auch die Bindung zu den Ereignissen dieses Modells. Als nächstes nennen wir die _reset() -Funktion der Sammlung, die wie folgt aussieht:

%Vor%

Es entfernt einfach jeden Hinweis auf irgendwelche Modelle, die die Sammlung jemals gehabt hat.

Was können wir daraus machen? Nun, die Sammlung reset -function in Backbone umgeht im Prinzip nur alle offiziellen Kanäle des Entfernens von Modellen und macht alles in Stille geheim, wodurch keine anderen Ereignisse als reset ausgelöst werden. Sie möchten also das Ereignis remove des Modells für jedes Modell auslösen, das beim Zurücksetzen aus einer Sammlung entfernt wurde? Einfach! Überschreibe einfach die Reset-Funktion von Backbone.Collection wie folgt:

%Vor%

Hoffe, das hilft!

    
jakee 02.08.2012 09:59
quelle