Ich versuche, basic render () nach fetch () bei der Sammlung (Backbone 0.9.2) zu machen:
%Vor%Das Erstellen einer neuen View-Instanz wird ausgegeben:
%Vor%So wird die render () nie nach fetch () aufgerufen. Was mache ich hier falsch? Es gibt keine Ausnahmen.
Irgendwelche Tipps, wie man diese Art von Dingen im Backbone debuggen kann?
Ps. Es scheint, dass diese Funktion angesichts der Anzahl von Fragen zu SO schlecht dokumentiert ist.
Aus dem Handbuch :
holen
collection.fetch([options])
Rufen Sie die Standardgruppe von Modellen für diese Sammlung vom Server ab und setzen Sie die Sammlung bei deren Ankunft zurück. [...] Wenn die Modelldaten vom Server zurückgegeben werden, wird die Sammlung zurückgesetzt.
Und was macht reset
? reset
tut dies:
Zurücksetzen
collection.reset(models, [options])
[...] 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öst.
So fetch
ruft reset
auf, um die Modelle der Sammlung zu aktualisieren, und reset
löst ein Ereignis "reset"
aus, nicht ein Ereignis "change"
. Keines der Modelle hat sich geändert und die "change"
-Ereignisse einer Sammlung stammen aus ihren Modellen.
Sie sollten render
an "reset"
binden:
Wenn Sie in den enthaltenen Modellen auf "change"
-Ereignisse warten möchten, können Sie einen "change"
-Handler an die Sammlung seit :
Sie können
"change"
-Ereignisse binden, um benachrichtigt zu werden, wenn ein Modell in der Sammlung geändert wurde,
[...]
Jedes Ereignis, das in einem Modell in einer Sammlung ausgelöst wird, wird auch direkt aus der Sammlung ausgelöst.
Die Sammlung generiert auch die Ereignisse "add"
und "remove"
, wenn sich die Sammlung selbst ändert.
Neuere Versionen von Backbone setzen die Sammlungen nicht mehr während fetch
zurück:
Wenn die Modelldaten vom Server zurückgegeben werden, verwendet sie set , um die abgerufenen Modelle (intelligent) zusammenzuführen, es sei denn, Sie übergeben
{reset: true}
. In diesem Fall ist die Auflistung (effizient) Zurücksetzen .
Und set
:
[...] führt eine "intelligente" Aktualisierung der Sammlung mit der übergebenen Modellliste durch. Wenn ein Modell in der Liste noch nicht in der Sammlung enthalten ist, wird es hinzugefügt. Wenn das Modell bereits in der Sammlung ist, werden seine Attribute zusammengeführt; Wenn die Sammlung Modelle enthält, die nicht in der Liste enthalten sind, werden sie entfernt. Alle entsprechenden Ereignisse
"add"
,"remove"
und"change"
werden ausgelöst, wenn dies geschieht
Bei neueren Backbone-Versionen sollten Sie also die Ereignisse "add"
, "remove"
und "change"
auflisten (auf die eine auf einer Sammlung basierende Ansicht trotzdem achten sollte); Sie könnten auch {reset: true}
für die ursprüngliche fetch
verwenden und auch "reset"
hören. Ich würde den folgenden Ansatz für Auflistungsansichten empfehlen:
"add"
und behandeln Sie dieses Ereignis mit einem Callback, das einfach ein Element zur Ansicht hinzufügt, werfen Sie nicht alles weg und rendern Sie es erneut. "remvoe"
und behandeln Sie dieses Ereignis mit einem Callback, das nur das neu entfernte Modell entfernt. "change"
und behandeln Sie das mit einem Callback, das das entsprechende Element ersetzt (oder aktualisiert). "reset"
und binden Sie das an render
. Übergeben Sie dann {reset: true}
an den ursprünglichen fetch
-Aufruf der Sammlung. Das wird die wichtigen Ereignisse auffangen und die Collection-Ansicht wird die minimale Menge an Arbeit machen, um mit jedem zu arbeiten. Natürlich ist diese Strategie nicht auf alle Situationen anwendbar, aber ich denke, dass dies ein guter Ausgangspunkt ist.
Dies hat sich in 1.0 geändert.
"Wenn Sie" reset "weiter verwenden möchten, übergeben Sie {reset: true}."
Tags und Links backbone.js