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.