Undefinierter Modellprototyp in Backbone Collection und Marionette CompositeView

8

Wenn ich versuche, eine Sammlung aus einer Werteliste aufzufüllen, erhalte ich einen Fehler, weil% code% der Sammlung model nicht definiert ist. Beim Betrachten dieser Frage zu einem ähnlichen Problem habe ich überprüft, dass das Modell tatsächlich vor erstellt wurde Die Sammlung wird nach besten Kräften instanziert.

Der Fehler wird in einem der Event-Handler der Marionette CompositeView, die die Collection enthält, ausgelöst, nachdem die Daten vom Server abgerufen wurden und versucht wurde, die Sammlung mit der Liste der Werte aus den Daten zu füllen, die aufgefüllt werden sollten hinein.

Hinweis: Verwenden von Backbone 0.9.10

Das Modell

%Vor%

Die Sammlung

%Vor%

Der entsprechende Code von CompositeView

%Vor%

Der Fehler

Der Fehler tritt in der Funktion prototype im Backbone auf, wenn Sie für das Modellobjekt eine reset ausführen, um zu prüfen, ob es sich um ein Duplikat handelt. Der fehlerhafte Code ist hier:

%Vor%

Hier schlägt die add fehl, weil die get für das Modell nicht definiert ist.

Warum passiert das und wie kann es behoben werden?

Vielen Dank!

    
Juan Carlos Coto 20.12.2013, 18:04
quelle

1 Antwort

5

Der Grund dafür ist, dass Sie in Babkbone 0.9.10, wenn Sie collection.reset(models) ohne Optionen aufrufen, die Modelle an collection.add() übergeben, die streng reelle Modelle als Argument benötigen.

Aber tatsächlich sind die Argumente, die Sie bestanden haben, keine wirklichen Modelle. Sie sind nur ein Array von Hash-Attributen.

Zwei Optionen zum Reparieren:

Option 1: Rufen Sie den Reset mit einer Parse-Option

auf %Vor%

Dann analysiert reset das Array von Hashes und setzt sie als Modell.

Option 2: Aktualisieren Sie auf die neueste Version Backbone 1.1.0.

Hier übernimmt reset() nicht länger die Verantwortung für add() , sondern verwendet set() smart. Diese Option wird empfohlen. Und Sie brauchen keine Optionen hier.

%Vor%

Ein anderer Punkt

Darf ich vorschlagen, dass Sie model in CompositeView nicht definieren? CompositeView ist für die Sammlung, nicht für das Modell. Natürlich verstehe ich, dass das Modell hier nur dazu dient, einige Daten zu halten und abzurufen, aber es wäre wirklich verwirrend, wenn der Code von einem anderen Entwickler gelesen würde, ebenso wie die eigene Pflege.

Um Bootstrapped-Daten zu erhalten, können Sie die Daten auf erste Anfrage laden und auf herkömmliche Weise in die Sammlung übernehmen. Ссылка

    
Billy Chan 20.12.2013, 19:32
quelle