Debuggen von Backbone.js: Rendern nach Sammlung fetch ()

8

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.

    
Fdr 27.11.2012, 06:55
quelle

3 Antworten

28

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:

%Vor%

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:

  1. Hören Sie "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.
  2. Hören Sie "remvoe" und behandeln Sie dieses Ereignis mit einem Callback, das nur das neu entfernte Modell entfernt.
  3. Hören Sie "change" und behandeln Sie das mit einem Callback, das das entsprechende Element ersetzt (oder aktualisiert).
  4. Hören Sie "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.

    
mu is too short 27.11.2012, 08:01
quelle
7

Dies hat sich in 1.0 geändert.

Ссылка

"Wenn Sie" reset "weiter verwenden möchten, übergeben Sie {reset: true}."

    
Dane Macaulay 31.05.2013 15:44
quelle
3

Ok, bis jemand erklären kann, warum die Bindung nicht funktioniert hat, habe ich die folgende Problemumgehung verwendet:

%Vor%     
Fdr 27.11.2012 07:35
quelle

Tags und Links