Jak wywołać wywołanie zwrotne sukcesu w modelu.save ()?


106
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

Model jest poprawnie wysyłany na serwer, który obsługuje zapisywanie, ale pomyślne wywołanie zwrotne nie jest uruchamiane. Czy muszę coś odesłać z serwera?


7
Okazuje się, że zrobiłem to źle: poprawna składnia powinna wyglądać następująco: this.model.save (newItem, {success: ..., error: ...})
Running Turtle

8
„null” wydaje się działać również jako symbol zastępczy.
UpTheCreek

@UpTheCreek Thanks. To pomogło. Spojrzałem na źródło i przekazałem pusty ciąg jako klucz i wartość. Lepiej jednak polub swoją metodę.
Pramod,

@UpTheCreek null nie działało dla mnie z jakiegoś powodu, ale przekazanie pustego attr obj nie
zadziałało

Odpowiedzi:


123

Pierwszym argumentem save to atrybuty do zapisania w modelu:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

9
Jestem trochę zdezorientowany - (1) Myślałem, że szkielet zawsze odsyła cały model podczas zapisywania (że nie jest możliwe wysyłanie częściowych aktualizacji modelu). Jaki jest więc cel nazw atrybutów? (2) A co jeśli chcesz po prostu zapisać model po wykonaniu niektórych .set () s - po co lista atrybutów? (3) W dokumentach parametr listy atrybutów jest wyświetlany jako opcjonalny. Możesz wyjaśnić? Dzięki.
UpTheCreek

7
Możesz zrobić kilka "zestawów" ze swoimi atrybutami, a następnie zapisać je bez żadnych atrybutów. Wszystkie atrybuty modelu są zawsze wysyłane na serwer. Zapisz z atrybutami to tylko skrót do ustawiania + zapisywania.
Julien

5
Choć wydaje się to głupie, właśnie to robi, szkoda, że ​​jest słabo udokumentowane.
Kevin

51
Z moich testów wynika, że ​​wywołania zwrotne powodzenia i błędu nie są uruchamiane, jeśli nie podasz czegoś dla parametru „atrybuty”. Wydaje się, że jest to sprzeczne z dokumentacją ... model.save ([atrybuty], [opcje]) wskazuje, że atrybuty są opcjonalne. Kiedy dołączam atrybuty lub null dla atrybutów, wywoływane są moje wywołania zwrotne sukcesu i błędu. Kiedy nie podam niczego dla atrybutów, wywołania zwrotne NIE są uruchamiane.
Kevin

6
sprawdziłem kod źródłowy backbone.js [ backbonejs.org/docs/backbone.html ]. wygląda na to, że atr jest obowiązkowy ... jeśli podano tylko „opcję”, funkcje przyjmują, że jest to „atr” i
psują

58

Z jakiegoś nieznanego powodu żadna z powyższych metod nie zadziałała. W moim przypadku sam interfejs API nie został trafiony.

Ale później, szukając tego, natknąłem się na ten link , gdzie ktoś próbował nullzamiast {}jako pierwszy parametr.

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

więc to zadziałało dla mnie. Mam nadzieję, że to też ci pomoże.


3
To jest poprawna odpowiedź. Jeśli przekażesz null, Backbone wyśle ​​wszystkie atrybuty do serwera w celu zapisania.
Paul Oliver,

Dziwne dziwactwo, ale moja wybrana metoda.
Matt Fletcher

37

Twój serwer musi zwrócić obiekt JSON. Jeśli odpowiedź nie jest obiektem JSON, wywołania zwrotne nie zostaną uruchomione.

Jeśli dla sukcesu serwer nie zwraca obiektu JSON, wykonaj zapis z opcją dataType: "text" , na przykład:

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

Dzięki tej opcji nie będzie czekał na odpowiedź JSON, ale tekst, a tym samym wywołanie zwrotne zostanie uruchomione.


O cholera, dziękuję. To doprowadzało mnie do szału. Byłoby wspaniale, gdyby zostało to udokumentowane gdzieś w dokumentacji Backbone,
Tobias J

to uratowało mi tyłek. Używałem res.json ({sukces: wynik}) z Express 4 i nadal sprawiało mi to problemy. Może muszę zrobić: res.json ({"success": "result"}) czy coś ...
Alexander Mills,

Wielkie dzięki! To poprawiło mój dzień.
alcfeoh

11

Możesz użyć podkreślenia lib w następujący sposób, ponieważ szkielet już od tego zależy. Pamiętaj, że pierwszy argument zapisu musi albo mieć atrybuty, albo możesz po prostu przekazać {} na wypadek, gdybyś chciał zapisać sam model.

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

8

więc jestem trochę zdezorientowany - czy nadal muszę przekazywać wszystkie atrybuty, aby wywołać zdarzenie zapisywania? co jeśli mój model jest duży ... nie chcę ustawiać każdej właściwości ręcznie

dzwonię do model.save i próbuję wykonać następujące czynności:

this.model.save(
    {
        success: function (model, response) {
            console.log('model saved');
        }
    });

ok, żeby odpowiedzieć na własne pytanie, na wypadek gdyby ktoś znalazł ten post, wykonałem następujące czynności:

this.model.save({ id: this.model.get('id') },
    {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });

EDYCJA: Z jakiegoś powodu nie mogę Ci odpowiedzieć, ale mogę edytować

ale nie musisz ustawiać id: this.model.get('id')możesz po prostu przekazać pusty obiekt, ponieważ pusty atrybut po prostu nie rozszerzy atrybutów, nic nie robi:

this.model.save({}, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

4

Poniżej znajduje się kod, którego używam do zapisywania modelu szkieletowego.

this.model.save(model,{
   success:function(model){
       console.log("Saved Successfully");
   },
   error:function(model){
       console.log("Error");
   }
});

Twoje zdrowie

Roy MJ


modelthis.modelmodelattributesthis.model
Przekazywanie

@Funkodebat: Tak. :) .. Właściwie myślałem, że jest to podobne do normalnego jquery-ajax, ale w Backbone pierwszym parametrem byłby model. Niekoniecznie przekazanie go, ale raczej uzyskanie odpowiedniego. To rzeczywiście dość niepokojące ... :(
Roy MJ

Cóż, prawda jest taka, że ​​nie, nie przekazujesz modelu podczas wywoływania save. pierwszy argument save to dodatkowe atrybuty, które możesz ustawić przed wywołaniem save. To byłoby jak dzwonienie model.set(model.toJSON()); model.save(). nie ma powodu, aby ustawić model zgodnie z tym, do czego jest ustawiony model… jest to uosobienie zbędnego przekazywania modelu do siebie podczas zapisywania.
Funkodebat

2
@Funkodebat Odrzuciłem twoje zmiany w tej 3-letniej odpowiedzi, ponieważ radykalnie zmieniły odpowiedź autora. Nie jest to celem systemu edycji / moderacji. Jeśli odpowiedź nie jest już aktualna lub właściwa, odrzuć ją i napisz nową. Narzędzia moderacji służą do poprawiania gramatyki, formatowania, pisowni i wielkich liter - nie do dostosowywania odpowiedzi innych użytkowników.
reach4thelasers

2
Społeczność nie zgodziłaby się z tobą. Jest to wysoko ocenione pytanie, na które otrzymała najwyższa odpowiedź. Pytanie wydaje się istotne dla społeczności. Jeśli się z czymkolwiek nie zgadzasz, użyj przycisku głosowania w dół. To nie twoje miejsce, aby dyktować, jakie pytania i odpowiedzi mają prawo być na tej stronie, a na pewno nie jest twoje miejsce, aby modyfikować odpowiedzi innych użytkowników do tego stopnia, że ​​ich znaczenie uległo drastycznej zmianie.
reach4thelasers

1

Dla tych, którzy chcą zapisać model bez aktualizowania atrybutów, możesz wykonać następujące czynności:

model.once("sync", function(model, response, options){
    //
});
model.once("error", function(model, response, options){
    //
});
model.save();

1

W inicjalizacji funkcji, powiąż metodę sync z metodą, którą zdefiniujesz (onSaveSuccess)

            initialize: function (options) {
                    this.model.on('sync', _.bind(this.onSaveSuccess, this));
},
            onSaveSuccess: function() {
                console.log('saved');
                this.render();
            },

W ten sposób za każdym razem, gdy uruchomisz this.model.save (), uruchomi on funkcję onSaveSuccess jako wywołanie zwrotne, jeśli synchronizacja się powiedzie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.