Backbone-Sync-Fehler auch nach Antwortcode 200

8

Hallo Backbone Ninjas,

Dies ist das erste Mal, dass ich Backbone benutze - bitte entschuldigen Sie meine "noob" -Ness. In meiner Funktionalität (Teil einer größeren App), habe ich eine Backbone View vA, unterstützt von einem Modell mA (wie es sein sollte) und die Server-Seite ist in Spring MVC Spring Controller-Methoden mit @RequestBody und @ResponseBody kommentiert. Ich habe Jackson gut mit Spring gearbeitet.

Jetzt in der App

%Vor%

mA hat seinen eigenen Endpunkt, und Backbone ruft das erfolgreich auf, wenn ich eine PUT-Anfrage mache, d. h. wenn ich save () von einem Submit-Button-Event-Handler von View vA wie folgt rufe:

this.model.save ({

%Vor%

});

Unser BaseModel hat folgendes:

%Vor%

Federreglermethode:

%Vor%

Auch bevor ich den Speicheraufruf tätige, modifiziere ich ein paar Model-Attribute, da das serverseitige DTO eine andere Struktur wie folgt hat:

%Vor%

Das Problem ist, dass der Aufruf von save () eine PUT-Anfrage erzeugt und erfolgreich den Spring-Endpunkt-Handler aufruft, aber ich bekomme einen Antwortcode 200 (was ich erwarte), aber wenn ich den Aufruf mit Firebug verfolge, geht es in die onSyncError-Methode und gibt mir eine Fehlermeldung (wegen des "Standard" -Falls darin).

Das Backbone-Dokument sagt: "Wenn Sie eine JSON-Antwort zurücksenden, senden Sie die Attribute des Modells, die vom Server geändert wurden, und müssen auf dem Client aktualisiert werden". Nun, ich muss das Modell auf der Client-Seite nicht aktualisieren, es ist einer der letzten Bildschirme und ich muss dem Benutzer nur einen Erfolg / Fehler und sagen leite ihn auf eine Hauptseite / ein Dashboard um.

Ich lese etwas mehr, und es scheint Code 200 als Antwort ist nicht ausreichend - es könnte JSON Parsing Fehler verursachen die Synchronisierung fehlschlagen.

Ich habe die Antwort in Firebug überprüft und die Antwort JSON sieht wie {"msg": "Success"} aus.

Also, was könnte schief gehen?

    
trishulpani 06.06.2013, 14:41
quelle

3 Antworten

1

Danke für Ihre Zeit. Ich war schließlich in der Lage, das Problem zu umgehen, indem ich $ .ajax verwendete, um die PUT-Anfrage zu machen, wodurch das gesamte Backbone-Sync-Thingy umgangen wurde. Mein Erfolgshandler im Ajax-Callback handhabt die Antwort und es gibt keine weiteren Synchronisierungsfehler (da sie sowieso nicht aufgerufen werden):)

    
trishulpani 06.06.2013, 20:03
quelle
9

Backbone.Model.save() erwartet, dass die Antwort vom Server ein aktualisierter Hash der Modellwerte ist. Wenn Ihre Antwort vom Typ {"msg":"Success"} ist, kann Backbone nicht mit Ihrem Modell synchronisiert werden. Im Grunde interpretiert es Ihre HTTP 200 JSON-Antwort als die Attribute des Modells und versucht, das Modell entsprechend zu synchronisieren.

Sie können entweder versuchen 1) Ihren Spring-Controller-Pfad eine JSON-ified-Modellantwort zurückgeben, 2) eine einfache 200 mit einem leeren Antworttext zurückgeben oder 3) eine benutzerdefinierte parse Methode, die nach Antworten mit dem {"msg":"Success"} Format sucht und anders reagiert.

    
brettjonesdev 06.06.2013 19:50
quelle
0

Ich teile meine Erfahrung mit dem gleichen Problem; benutzerdefiniertes Basismodell und Aufruf von model.save und kein Erfolgsereignis ausgelöst.

Mein Problem war mit einer benutzerdefinierten Funktion im Basismodell, die "this" nicht zurückgab.

Wenn Sie auf den Backbone-Quellcode für Model-Save schauen, finden Sie dieses Snippet:

%Vor%

Das! model.set (serverAttrs, Optionen) ist in meinem Fall fehlgeschlagen und die Speicherfunktion hat false zurückgegeben, bevor Ereignisse ausgelöst wurden.

Vielleicht war das nicht dein Problem, aber hoffentlich hilft es jemandem da draußen ...

    
Ken1 23.10.2013 14:25
quelle