2012-07-31 8 views
7

Chciałbym zapisać zmieniony model do bazy danych (wcześniej ustawione). Jeśli zapisanie powiodło się przekierowanie na inną stronę (na przykład może to być dowolna inna akcja).Jak zapisywać z backbone.js bez określania, które atrybuty, ale z oddzwonieniem

Model.save może mieć dwie opcjonalne właściwości. Pierwszy to skrót właściwości, a drugi to opcje (na przykład wywołanie zwrotne sukcesu i błędu). http://backbonejs.org/#Model-save

somemodel.set({foo: 'bar'}); 
//lots of other logic and misc steps the user has to do 
somemodel.save(); //on success should go here 

Ponieważ atrybuty są już ustawione, muszę tylko zwrotnego.

W przeszłości robiłam:

somemodel.save(somemodel.toJSON(), { 
    success: function() { 
     //other stuff 
    } 
); 

lub przekazując wartości ponownie do zapisywania metoda

somemodel.save(
    { foo: this.$('input').val()}, 
    { success: function(){} 
); 

szukam sposobu na to posprzątać. Dokumenty wskazują, model uruchomi stan zmiany, jeśli pojawią się nowe właściwości. Ale mimo to chciałbym przekierować użytkownika (zapis na nowej zawartości lub stary/niezmieniony).

to nie istnieje:

somemodel.on('success', function(){}); 

a to jest tylko do walidacji:

if(somemodel.save()) { //action } 

również "sync" jest źle wydarzenie (ponieważ działa również zniszczyć)

Każda pomoc?

Odpowiedz

12
somemodel.save(
    {}, // or null 
    { 
      success: function(){} 
    } 
); 

pozwoli Ci zapisać model z określonym zwrotnym bez modyfikowania istniejących kluczy.

A Fiddle http://jsfiddle.net/h5ncaayu/

Aby uniknąć przeniesienia zwrotnego sukces jako opcja, można

  • obsługi obietnica zwrócony przez save:

    somemodel.save().then(...youcallback...) 
    
  • lub użyć zdarzenia :

    somemodel.on('sync', ...youcallback...); 
    somemodel.save(); 
    
+0

Dzięki, jest to zdecydowanie lepsze niż to, co miałem. Szkoda, że ​​nadal czuje się trochę brudna (dostarczaj parampera, tylko po to, aby zapewnić mu parametry). Może powinienem zagłębić się głębiej i nadpisać/rozszerzyć Backbone.sync, aby przywrócić "sukces" i "błąd". Dziwne, że robi to domyślnie, ponieważ kręgosłup jest tak luźno powiązany ze zdarzeniami w przeciwieństwie do wywołań zwrotnych. – Jareish

+1

{} i null to nie to samo w tym kontekście.{} oznacza wysłanie pustego obiektu do serwera, podczas gdy wartość null oznacza, że ​​nie przekazujesz żadnego obiektu do zapisania(), a funkcja save() powinna wysyłać atrybuty obiektu. – jerzy

+0

@jerzy To jest niepoprawne, proszę sprawdź Dokument kręgosłupa na 'model.save': pełna reprezentacja zasobu jest wysyłana do serwera, jeśli nie przekazujesz opcji' patch: true' http://backbonejs.org/# Zapisywanie modelu. {} i null będą miały to samo zachowanie – nikoshr

3

Backbone.Model ma bardzo wygodną metodę o nazwie "changedAttributes", która zwróci mieszankę o zmienionych atrybutach, które można przekazać, aby zapisać. Więc ...

model.save(
    model.changedAttributes(), 
    { 
     success : _.bind(function() {...},this), //_.bind() will give scope to current "this" 
     error : _.bind(function() {...},this); 
    } 
); 

Ładny i schludny ...

+0

Również miło i zdecydowanie będzie przydatne, ale wolę inne rozwiązanie lepiej, myślę (mniej kodu). Fajne rozwiązanie z tym związaniem! Zawsze zapisywałem to w innej zmiennej, dzięki czemu mogłem uzyskać dostęp do wywołania zwrotnego sukcesu/błędu, ale jest to silniejsze. – Jareish

+0

Warto wspomnieć, że to podejście nie zgłosi zmienionych atrybutów poza zdarzeniem zmiany, więc możliwe jest, że zmienna methodType() zwróciłaby wartość false zamiast rzeczywistych zmienionych atrybutów. Tylko coś do zapamiętania. –

Powiązane problemy