2013-06-06 13 views
8

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?

+1

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

+0

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

Odpowiedz

1

Dzięki za poświęcony czas.W końcu udało mi się obejść ten problem, używając $ .ajax do wykonania żądania PUT, omijając w ten sposób całą synchronizację Backbone. Mój menedżer sukcesu w wywoływaniu ajax obsługuje odpowiedź i nie ma już błędów synchronizacji (ponieważ nie jest to tak czy inaczej) :)

+0

Nie ma problemu. Nie jestem pewien, czy omijanie problemu przez bezpośrednie wywoływanie $ .ajax jest najlepszym rozwiązaniem, ale cokolwiek działa dla ciebie. Możesz również sprawdzić [ten wątek] (http://stackoverflow.com/questions/6394108/how-should-server-respond-to-backbone-sync?rq=1), który odpowiada na pytanie, jak serwer powinien odpowiedzieć 'model.save()'. – brettjonesdev

9

Backbone.Model.save() oczekuje, że odpowiedź serwera na zaktualizowany skrót wartości modelu. Jeśli twoja odpowiedź jest rodzaju {"msg":"Success"}, Szkielet może się nie zsynchronizować z twoim modelem. Zasadniczo interpretuje ona odpowiedź JSON HTTP 200 jako atrybuty modelu i próbuje odpowiednio zsynchronizować model.

Możesz spróbować albo 1) Utworzenie ścieżki kontrolera Spring zwróci odpowiedź modelu JSON, 2) Zwrócenie zwykłego 200 z pustym tekstem odpowiedzi lub 3) napisanie niestandardowej metody parse, która szuka odpowiedzi w formacie {"msg":"Success"} i reaguje inaczej.

+3

pusta treść odpowiedzi nadal będzie wywoływać procedurę obsługi błędów, odpowiedź '{} '' nie będzie miała znaczenia. – robertjlooby

0

Podzielę się moim doświadczeniem z tym samym problemem; niestandardowy model podstawowy i wywoływanie modelu.save i brak zdarzenia powodzenia.

Mój problem polegał na niestandardowej funkcji zestawu w modelu podstawowym, która nie zwróciła "tego".

Jeśli zerknąć na kod źródłowy kręgosłup dla modelu oszczędzania znajdziesz ten fragment:

options.success = function(resp) { 
    // Ensure attributes are restored during synchronous saves. 
    model.attributes = attributes; 
    var serverAttrs = model.parse(resp, options); 
    if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 
    if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 
     return false; 
    } 
    if (success) success(model, resp, options); 

    model.trigger('sync', model, resp, options); 
    }; 

The model.set (serverAttrs, opcje) nie powiodło się w moim przypadku i zapisać funkcja powrócił false przed wyzwalaniem jakichkolwiek zdarzeń.

Może to nie był problem, ale mam nadzieję, że to pomoże ktoś tam ...

Powiązane problemy