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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top