Witam ninja kręgosłup,Backbone nawet po kodu odpowiedzi 200
To jest mój pierwszy raz przy użyciu Backbone - więc proszę wybaczyć „noob” Ness. W mojej funkcjonalności (część większej aplikacji) mam Backbone View vA, wspierany przez model mA (tak jak powinien być), a po stronie serwera jest Spring MVC z przypisanymi metodami kontrolera Spring z @RequestBody i @ResponseBody. Mam Jacksona, który działa dobrze z wiosną.
Teraz w aplikacji,
Backbone.Model
|_ BaseModel (custom base model for our app)
|_ mA (my model)
mA ma swój własny punkt końcowy i Backbone powodzeniem wywołuje że składając wniosek PUT czyli gdy zgłoszę save() od złożenia przycisk obsługi zdarzeń z widoku vA tak:
this.model.save ({
success : function(){
alert('Request submitted successfully');
},
error : function(){
alert('Something awful happened.');
}
});
Nasz BaseModel ma następujący:
define([], function() {
window.BaseModel = Backbone.Model.extend({
......
});
onSyncError : function(model, response) {
switch (response.status) {
case 403:
[...//some more code ]
default:
alert(bundle.getDefault('HTTP_RESP_OTH') + response.status);
}
},
onSyncSuccess : function(model, response) {
alert('Sync done! ');
},
sync : function(method, model, options) {
options.error = this.onSyncError;
Backbone.sync.call(this, method, model, options);
....//some more stuff.
},
}
Wiosna metody kontrolera:
@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes = {"application/json"}
, produces = {"application/json"})
@ResponseBody
public Map<String,String> methodX(@RequestBody XyzDTO xyzDTO){
....
map.put("msg", "success");
return map;
}
Ponadto, tuż przed robię zapisać zadzwonić, zmodyfikować niektóre modelu atrybutów, ponieważ DTO po stronie serwera ma inną strukturę jak:
this.model.unset("abc",{ silent: true });
this.model.set({ abc: {id : "2",xyz:{ ... //more code });
Problem polega na wywołaniu save() generuje PUT request i pomyślnie wywołuje procedurę obsługi punktu końcowego Spring, ale otrzymuję kod odpowiedzi 200 (który jest tym, czego się spodziewam), , ale kiedy prześledzę połączenie z Firebug, przechodzi do metody onSyncError i wyświetla mi komunikat o błędzie (z powodu przypadek "domyślny").
Dokumentacja kręgosłupa mówi: "Podczas zwracania odpowiedzi JSON, należy wysłać atrybuty modelu, które zostały zmienione przez serwer, i muszą zostać zaktualizowane na kliencie". Cóż, nie muszę aktualizować modelu po stronie klienta, jego jednego z ostatnich ekranów i muszę tylko poinformować użytkownika o powodzeniu/błędzie i przekierować go na stronę główną/pulpit.
Przeczytałem jeszcze trochę i wydaje się, że kod 200, ponieważ odpowiedź nie jest wystarczająca - mogą wystąpić błędy analizy JSON powodujące niepowodzenie synchronizacji.
Sprawdziłem odpowiedź w Firebug, a odpowiedź JSON wygląda następująco {"msg": "Sukces"}.
Co może być nie tak?
Nie jestem pewien, czy będzie to powodować problemu, ale miałem problemy, zanim się z tym, że 'Backbone Metoda .Model.save() 'faktycznie wymaga od ciebie zapisania danych jako pierwszego argumentu, na przykład:' model.save (model.toJSON(), {sukces: function() {}, error: function() {}); Mam problemy z tym związane w przeszłości, kiedy dostałem dziwne błędy, ponieważ zapomniałem, że musisz jawnie przekazać dane, które chcesz zapisać/opublikować. Może spróbować. – brettjonesdev
Dziękujemy za poświęcony czas. Ale to nie pomogło. Teraz otrzymuję to w Firebug, gdy odpowiedź zwraca: TypeError: a jest niezdefiniowana ... funkcja bi (a, b, d) {var e = b.dir, f = d && b.dir === "parentNode", g = u ++; ... – trishulpani