2011-10-20 19 views
11

Z backbone.js zapisuję model. PUT jest wysyłany do serwera, a odpowiedź jest zwracana. Za pierwszym razem, gdy to robię, zwraca on sukces, a następnie zwraca błąd, ponieważ po raz pierwszy odpowiedź jest dodawana do modelu.Jak uzyskać dobrą odpowiedź z zapisywania modelu

Zapisz funkcja w backbone.js:

saveCountry: function() { 
    this.model.save({},{ 
     success: function(model, response) { 
      console.log('success! ' + response); 
     }, 
     error: function(model, response) { 
      console.log('error! ' + response); 
     } 
    }); 
    this.render(); 

    return false; 
}, 

PHP zwraca JSON-string:

{"response": "Model saved!"} 

Following PUT Get błąd jako odpowiedź, ponieważ 'reakcja' zostanie dodany do modelu:

Unknown column 'response' in 'field list' 

Dlaczego odpowiedź jest dodawana do modelu i jak mogę temu zapobiec?

+0

Nie możesz po prostu zrobić warunku i pominąć "odpowiedź" w swoim skrypcie php? – swatkins

+0

Mogłem, ale myślałem, że to będzie czystsze, aby strona serwera zdecydowała o odpowiedzi. – GijsjanB

+0

Masz na myśli stronę "klienta"? – swatkins

Odpowiedz

7

Z dokumentacji kręgosłup w sprawie modelu save:

Ustaw skrót modelu atrybuty i synchronizację modelu do serwera. Jeśli serwer zwróci wartość mieszającą atrybutów, stan modelu zostanie ponownie ustawiony. http://documentcloud.github.com/backbone/docs/backbone.html#section-41

Co zrobić, aby to działało: nie wracają { "odpowiedź": "model zapisany!"} Z serwera. Po prostu odnieś sukces (status 200) bez zawartości.

Jeśli składowanie nie działa, zwróć JSON z błędami, a Backbone wywoła zdarzenie błędu w twoim modelu, z podanym przez ciebie JSON (patrz http://documentcloud.github.com/backbone/docs/backbone.html#section-41 i http://documentcloud.github.com/backbone/docs/backbone.html#section-145).

6

Wystarczy wskrzeszać starożytną wątek ...

Nie zawsze jest to możliwe/pożądane, aby zmienić odpowiedź wrócisz z serwera. Kolejnym rozwiązaniem jest zastąpienie w modelu modelu parse, aby się tym zająć W twojej sytuacji, gdy odpowiedź jest nieodpowiednia dla WSZYSTKICH twoich modeli, możesz to zrobić w superklasie.

MyModel = Backbone.Model.extend({ 
    parse: function(data) { 
     delete data["success"]; 
     return data; 
    } 
}); 

Address = MyModel.extend({ 
    saveCountry: function() { 
     this.model.save({},{ 
      success: function(model, response) { 
       console.log('success! ' + response); 
      }, 
      error: function(model, response) { 
       console.log('error! ' + response); 
      } 
     }); 
     this.render(); 

     return false; 
    }, 

    ... 

}); 
Powiązane problemy