Bessere Lösung für verschachtelte Backbone.js Sammlungen
Viele meiner Rückgrat Modelle beschäftigen sich oft mit verschachtelten Modellen und Sammlungen, so weit bin ich mit einer Kombination von defaults
, parse
und toJSON
manuell zu erreichen verschachteln:
ACME.Supplier = Backbone.Model.extend({
defaults: function() {
return {
contacts: new ACME.Contacts(),
tags: new ACME.Tags(),
attachments: new ACME.Attachments()
};
},
parse: function(res) {
if (res.contacts) res.contacts = new ACME.Contacts(res.contacts);
if (res.tags) res.tags = new ACME.Tags(res.tags);
if (res.attachments) res.attachments = new ACME.Attachments(res.attachments);
return res;
}
});
ACME.Tag = Backbone.Model.extend({
toJSON: function() {
return _.pick(this.attributes, 'id', 'name', 'type');
}
});
Ich habe ein paar plugins gibt, die im Grunde genommen die gleiche wie oben, aber mit viel weniger Kontrolle und mehr boilerplate, so Frage ich mich, wenn jemand eine elegantere Lösung für dieses gemeinsame Backbone.js problem.
Edit: ich landete mit dem folgenden Ansatz:
ACME.Supplier = Backbone.Model.extend({
initialize: function(options) {
this.tags = new ACME.Tags(options.tags);
},
parse: function(res) {
res.tags && this.tags.reset(res.tags);
return res;
}
});
ACME.Tag = Backbone.Model.extend({
toJSON: function() {
return _.pick(this.attributes, 'id', 'name', 'type');
}
});
Es ist erwähnenswert, dass später entdeckte ich, dass Sie brauchen, um passieren verschachtelten Modell/Sammlung von Daten aus dem Konstruktor in Konstruktor der geschachtelten Modelle mit dem options
Objekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich sehe kein problem mit deinem Ansatz.
IMHO die
Model.parse()
Methode, wenn für diese: zu überschrieben werden, falls Besondere parse-Verhalten muss.Nur denken, dass ich ändern würde wären Dinge wie:
Dafür:
Durch Sie bereits eine Instanz von
ACME.Tags
Sammlung, ich würde Sie wiederverwenden.Auch ich weiß nicht wirklich, wie die
defaults
Umsetzung, ich bin es gewohnt, das zu tun diese Initialisierungen in derModel.initialize()
aber ich denke, das ist eine Frage des Geschmacks.I ' V fand heraus, dass mit diesem Ansatz Lieferanten toJSON-Funktion wird überholt, so könnte es eine gute Idee zu tun, wieder zusammenbauen, wieder es ist JSON Zustand aus es, und es ist die Daten von Kindern.
});
Wollten wir nicht hinzufügen, um einen anderen Rahmen zu erreichen, der abstrahiert, so dass wir es entfernt in einem Basis-model-Klasse.
Hier ist, wie Sie deklarieren und verwenden Sie es (als gist):
Es funktioniert genauso gut mit
set
undtoJSON
.Und hier ist
BaseModel
:Konfrontiert mit dem gleichen problem, sowas mache ich (der code unten ist die Ausgabe der TypeScript-compiler so, es ist ein bisschen verbose):
Und dann kann ich einfach überschreiben fieldToType Methode zu definieren, die Arten meiner Felder: