Ich habe das gleiche Problem, während ich meine Backbone-Anwendung schreibe. Sich mit eingebetteten / verschachtelten Modellen befassen müssen. Ich habe einige Verbesserungen vorgenommen, die ich für eine recht elegante Lösung hielt.
Ja, Sie können die Analysemethode ändern, um Attribute im Objekt zu ändern, aber all das ist eigentlich ziemlich nicht wartbarer Code IMO und fühlt sich eher wie ein Hack als wie eine Lösung an.
Folgendes schlage ich für Ihr Beispiel vor:
Definieren Sie zuerst Ihr Layoutmodell so.
var layoutModel = Backbone.Model.extend({});
Dann ist hier dein Bildmodell:
var imageModel = Backbone.Model.extend({
model: {
layout: layoutModel,
},
parse: function(response){
for(var key in this.model)
{
var embeddedClass = this.model[key];
var embeddedData = response[key];
response[key] = new embeddedClass(embeddedData, {parse:true});
}
return response;
}
});
Beachten Sie, dass ich das Modell selbst nicht manipuliert habe, sondern lediglich das gewünschte Objekt von der Analysemethode zurückgegeben habe.
Dies sollte die Struktur des verschachtelten Modells sicherstellen, wenn Sie vom Server lesen. Jetzt werden Sie feststellen, dass das Speichern oder Einstellen hier tatsächlich nicht behandelt wird, da ich der Meinung bin, dass es für Sie sinnvoll ist, das verschachtelte Modell explizit mit dem richtigen Modell festzulegen.
Wie so:
image.set({layout : new Layout({x: 100, y: 100})})
Beachten Sie außerdem, dass Sie die Analysemethode in Ihrem verschachtelten Modell tatsächlich aufrufen, indem Sie Folgendes aufrufen:
new embeddedClass(embeddedData, {parse:true});
Sie können so viele verschachtelte Modelle im model
Feld definieren, wie Sie benötigen.
Natürlich, wenn Sie das verschachtelte Modell in einer eigenen Tabelle speichern möchten. Das würde nicht ausreichen. Beim Lesen und Speichern des gesamten Objekts sollte diese Lösung jedoch ausreichen.
define(['modelFile'], function(MyModel){... do something with MyModel})
Aber Sie haben Recht. Ich mache es mir zur Gewohnheit, das Modell anhand der von Ihnen vorgeschlagenen Konvention zu referenzieren.Backbone.Model.prototype.parse
Funktion hinzuzufügen . Dann müssen Ihre Modelle lediglich die Objekttypen des Untermodells definieren (in Ihrem Attribut "Modell").Ich poste diesen Code als Beispiel für den Vorschlag von Peter Lyon, die Analyse neu zu definieren. Ich hatte die gleiche Frage und dies funktionierte für mich (mit einem Rails-Backend). Dieser Code ist in Coffeescript geschrieben. Ich habe ein paar Dinge für Leute explizit gemacht, die damit nicht vertraut sind.
oder in JS
quelle
Verwendung
Backbone.AssociatedModel
von Backbone-Assoziationen :quelle
Ich bin nicht sicher, ob Backbone selbst einen empfohlenen Weg hat, dies zu tun. Hat das Layout-Objekt eine eigene ID und einen eigenen Datensatz in der Back-End-Datenbank? Wenn ja, können Sie es zu einem eigenen Modell machen, wie Sie es haben. Wenn nicht, können Sie einfach lassen Sie es als verschachteltes Dokument, so stellen Sie sicher , konvertieren Sie es in und aus JSON richtig in den
save
undparse
Methoden. Wenn Sie am Ende einen solchen Ansatz wählen, ist Ihr A- Beispiel meiner Meinung nach konsistenter mit dem Backbone, daset
es ordnungsgemäß aktualisiertattributes
wird. Ich bin mir jedoch nicht sicher, was das Backbone standardmäßig mit verschachtelten Modellen macht. Es ist wahrscheinlich, dass Sie dafür benutzerdefinierten Code benötigen.quelle
new
Operator. Ich habe es bearbeitet, um diesen Fehler zu beheben.Ich würde Option B wählen, wenn Sie die Dinge einfach halten möchten.
Eine weitere gute Option wäre die Verwendung von Backbone-Relational . Sie würden einfach so etwas definieren wie:
quelle
Ich verwende das Backbone DeepModel-Plugin für verschachtelte Modelle und Attribute.
https://github.com/powmedia/backbone-deep-model
Sie können binden, um Ereignisse und Ebenen tief zu ändern. beispielsweise:
model.on('change:example.nestedmodel.attribute', this.myFunction);
quelle
CoffeeScript-Version von Rycfung's schöner Antwort:
Ist das nicht süß? ;)
quelle
Ich hatte das gleiche Problem und habe mit dem Code in Rycfung's Antwort experimentiert , was ein großartiger Vorschlag ist.
Wenn aber wollen Sie nicht zu
set
den verschachtelten Modelle direkt, oder wollen nicht ständig passieren{parse: true}
in deroptions
, wäre ein weiterer Ansatz, neu zu definieren ,set
selbst.In Backbone 1.0.0 ,
set
heißt inconstructor
,unset
,clear
,fetch
undsave
.Betrachten Sie das folgende Supermodell für alle Modelle, die Modelle und / oder Sammlungen verschachteln müssen.
Beachten Sie, dass
model
,_setModel
und_unsetModel
sind leer absichtlich links. Auf dieser Abstraktionsebene können Sie wahrscheinlich keine vernünftigen Aktionen für die Rückrufe definieren. Möglicherweise möchten Sie sie jedoch in den erweiterten Untermodellen überschreibenCompoundModel
.Diese Rückrufe sind beispielsweise nützlich, um Listener zu binden und
change
Ereignisse zu verbreiten.Beispiel:
Damit haben Sie die automatische Erstellung verschachtelter Modelle und die Weitergabe von Ereignissen. Die Verwendung von Beispielen wird ebenfalls bereitgestellt und getestet:
Ausgabe:
quelle
Mir ist klar, dass ich zu spät zu dieser Party komme, aber wir haben kürzlich ein Plugin veröffentlicht, um genau dieses Szenario zu behandeln. Es heißt Backbone-Nestify .
Ihr verschachteltes Modell bleibt also unverändert:
var Layout = Backbone.Model.extend({...});
Verwenden Sie dann das Plugin, um das enthaltene Modell zu definieren (mit Underscore.extend ):
Angenommen, Sie haben ein Modell,
m
das eine Instanz von istImage
, und Sie haben den JSON von der Frage an festgelegtm
, können Sie Folgendes tun:quelle
Verwenden Sie Backbone-Formulare
Es unterstützt verschachtelte Formulare, Modelle und toJSON. Alles verschachtelt
quelle
Wenn Sie nicht noch einen weiteren Rahmen hinzufügen möchten, könnten Sie eine Basisklasse mit überschriebene Erstellung
set
undtoJSON
und verwenden Sie es wie folgt aus :Sie benötigen
BaseModel
aus dieser Antwort (verfügbar, wenn Sie möchten , als Kern ).quelle
Wir haben auch dieses Problem und ein Teamarbeiter hat ein Plugin namens Backbone-Nested-Attribute implementiert.
Die Bedienung ist sehr einfach. Beispiel:
Damit kann das Baummodell dann auf Früchte zugreifen:
Weitere Informationen finden Sie hier:
https://github.com/dtmtec/backbone-nested-attributes
quelle