Backbone.js-Modell und Sammlungsaufwand
-
11-12-2019 - |
Frage
Wenn ich Modelle oder Sammlungen vom Server abrufe, kann ich nur dann auf Eigenschaften des Modells zugreifen, wenn ich stringifiziere und dann erneut analysiere.Vermutlich haben die Modelle selbst einen zusätzlichen Overhead vom Backbone.js?Beachten Sie, dass ich im folgenden Code sequentiell stringifizieren / analysieren kann, was das gleiche Ergebnis liefern soll, mit dem ich begonnen habe.Es ist jedoch klar, dass ich durch Ausführen dieser beiden Schritte einige überflüssige Informationen beseitigt habe, da die Eigenschaften meines Modells jetzt anders als zuvor angezeigt werden.Sicherlich muss ich diese beiden Schritte nicht durchlaufen, um auf meine Modelleigenschaften zuzugreifen, oder?
Eg.
thismodel = /// assume this came from server fetch
alert(thismodel.name); // DOES NOT WORK - undefined
jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name); // WORKS
Lösung
Backbone-Modellobjekte sind keine einfachen alten JavaScript-Objekte.Sie behalten ihre Attribute in ein interner Hash.Für den Zugriff auf die name
attribut können Sie dies entweder tun:
alert(thismodel.attributes.name);
Oder noch besser verwenden die Methode get():
alert(thismodel.get("name"));
Der Grund, warum es funktioniert, wenn Sie das Modell in JSON und dann wieder zurück konvertieren, ist folgender: JSON.stringify
nennen die toJSON() -Methode, das eine JSON-Zeichenfolge aus erstellt der interne Attributhash, Das heißt, wenn Sie diese Zeichenfolge analysieren, erhalten Sie ein einfaches altes JavaScript-Objekt - das nicht mit einem Backbone-Modellobjekt identisch ist.
Andere Tipps
Versuchen Sie zunächst, auf die Eigenschaft des Modells oder der Antwort zuzugreifen?
Aus alert(thismodel.name)
Es scheint, dass Sie eine Eigenschaft des Modells anstreben, nicht das Attribut.Wenn Sie nach dem Modellattribut suchen, dann möchten Sie es vielleicht alert(this.model.get('name'))
Wenn Sie sich tatsächlich für „model.name“ entscheiden, liegt das Problem möglicherweise darin, wie Sie die Daten analysieren.Angenommen, der JSON-Code Ihres Servers lautet beispielsweise wie folgt: {'name':'Jimmy'}.
Während model.response
Der gesendete rohe JSON-Code hat den Namensraum „Jimmy“ unter „object.name“. Backbone übernimmt diesen automatisch und wandelt ihn in ein Modellattribut um, sofern nicht anders angegeben (z. B.modelObj.attributes.name), an welcher Stelle Sie die verwenden würden get()
Funktion.
Wenn alles funktioniert, sollten Sie relativ einfach auf Modelldaten zugreifen können.
Z.B.Bringen
var model = new MyModel();
model.id = 1;
model.fetch({
success: function(model, response) {
console.log(model.get('name')); // The model name attribute
console.log(response.name); // The RAW response name property
}
});
Oder vielleicht sendet Ihr Server die Daten nicht als JSON-Daten zurück.Ist die Serverantwort content-type="application/json"
?
Einige Dinge zu überprüfen.