Come si attiva il callback di successo su un model.save ()?


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

Il modello viene inviato correttamente al server che gestisce il salvataggio, ma il callback di successo non viene attivato. Devo restituire qualcosa dal server?


7
Risulta che stavo sbagliando: la sintassi corretta dovrebbe essere: this.model.save (newItem, {success: ..., error: ...})
Running Turtle

8
"null" sembra funzionare bene anche come segnaposto.
UpTheCreek

@UpTheCreek Grazie. Questo ha aiutato. Ho guardato l'origine e ho passato una stringa vuota come chiave e valore. Mi piace di più il tuo metodo però.
Pramod

@UpTheCreek null non ha funzionato per me per qualche motivo, ma passare un attr obj vuoto ha funzionato :)
KoalaKid

Risposte:


123

Il primo argomento del salvataggio sono gli attributi da salvare sul modello:

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

9
Sono un po 'confuso - (1) pensavo che la dorsale avesse sempre rispedito l'intero modello durante il salvataggio (che non fosse possibile inviare aggiornamenti parziali del modello). Allora qual è lo scopo dell'attributo name-values? (2) Cosa succede se si desidera salvare il modello dopo aver eseguito alcuni .set () s - perché l'elenco degli attributi? (3) Nella documentazione, l'attributo list param è mostrato come opzionale. Puoi chiarire? Grazie.
UpTheCreek

7
Puoi fare un mucchio di "set" con i tuoi attributi e poi fare un salvataggio senza attributi. Tutti gli attributi del modello vengono sempre inviati al server. Salva con attributi è solo una scorciatoia per impostare + salvare.
Julien

5
Per quanto possa sembrare sciocco, questo è esattamente quello che fa, peccato che sia scarsamente documentato.
Kevin

51
Nei miei test sembra che i callback di successo e di errore non vengano attivati ​​se non si passa qualcosa per il parametro "attributi". Questo sembra contraddire la documentazione ... model.save ([attributi], [opzioni]) indicherebbe che gli attributi sono opzionali. Quando includo attributi o null per gli attributi, vengono attivati ​​i callback di successo e di errore. Quando non includo nulla per gli attributi, i callback NON vengono attivati.
Kevin il

6
controllato il codice sorgente di backbone.js [ backbonejs.org/docs/backbone.html ]. sembra che l'attr sia obbligatorio .. se viene fornita solo "opzione", la funzione presume che sia "attr" e
incasina

58

Per qualche motivo sconosciuto , nessuno dei metodi sopra ha funzionato per me. Solo l'API non è stata colpita nel mio caso.

Ma più tardi durante la ricerca su questo, mi sono imbattuto in questo link , dove qualcuno aveva provato nullinvece {}come primo parametro.

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

quindi, questo ha funzionato per me. Spero che questo aiuti anche te.


3
Questa è la risposta corretta. Se passi in null Backbone invierà tutti gli attributi al server per il salvataggio.
Paul Oliver

Strano capriccio, ma il mio metodo scelto.
Matt Fletcher

37

Il tuo server deve restituire un oggetto JSON. Se la risposta non è un oggetto JSON, i callback non verranno attivati.

Se per successo il tuo server non restituisce un oggetto JSON, esegui un salvataggio con dataType: opzione "text" , in questo modo:

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

Con questa opzione non aspetterà un JSON in risposta, ma un testo, e quindi verrà lanciato il callback.


Santo cielo grazie. Questo mi stava facendo impazzire. Sarebbe fantastico se questo fosse documentato da qualche parte nei documenti di Backbone,
Tobias J

questo mi ha salvato il culo. Stavo usando res.json ({success: result}) con Express 4, e questo mi dava ancora problemi. Forse devo fare: res.json ({"success": "result"}) o qualcosa del genere ...
Alexander Mills,

Molte grazie! Mi ha cambiato la giornata in positivo.
alcfeoh

11

È possibile utilizzare il carattere di sottolineatura lib come segue poiché il backbone dipende già da questo. Ricorda che il primo argomento di salvataggio deve avere attributi o puoi semplicemente passare {} nel caso in cui desideri salvare il modello stesso.

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

8

quindi sono un po 'confuso: devo ancora passare tutti gli attributi per poter chiamare un evento di salvataggio? cosa succede se il mio modello è grande .. non desidero impostare manualmente ogni proprietà

sto chiamando model.save e sto tentando di fare quanto segue:

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

ok solo per rispondere alla mia domanda nel caso in cui qualcuno trovasse questo post, ho fatto quanto segue che funziona:

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

EDIT: non ho potuto risponderti per qualche motivo, ma posso modificare

ma non devi impostare id: this.model.get('id')puoi semplicemente passare un oggetto vuoto perché un attributo vuoto semplicemente non estenderà gli attributi, non fa nulla:

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

4

Quello che segue è il codice che sto usando per il salvataggio del modello backbone.

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

Saluti

Roy MJ


è un po 'fastidioso passare un locale modela un this.model.. modeldovrebbe essere attributes, che sono impostati e salvati insieme a tutto inthis.model
Funkodebat

@Funkodebat: Sì. :) .. In realtà pensavo che fosse simile al normale jquery-ajax, ma in Backbone, il primo parametro sarebbe il modello. Non necessariamente passandolo, ma piuttosto ottenendo quello corrispondente. È davvero inquietante .. :(
Roy MJ

Beh, la verità è che no, non passi il modello quando chiami save. il primo argomento di save sono attributi extra che puoi impostare prima di chiamare save. Sarebbe come chiamare model.set(model.toJSON()); model.save(). non c'è motivo di impostare un modello su cui è impostato il modello .. è l'epitome di ridondante passare un modello a se stesso durante il salvataggio.
Funkodebat

2
@Funkodebat Ho rifiutato le tue modifiche a questa risposta di 3 anni poiché hanno cambiato radicalmente la risposta dell'autore. Questo non è l'intento del sistema di modifica / moderazione. Se la risposta non è più pertinente o appropriata, votala e scrivine una nuova. Gli strumenti di moderazione servono per correggere grammatica, formattazione, ortografia e lettere maiuscole, non per modificare le risposte di altri utenti.
reach4thelasers

2
La comunità non sarebbe d'accordo con te. È una domanda molto votata con una risposta più votata. La domanda sembra rilevante per la comunità. Se non sei d'accordo con qualcosa, usa il pulsante di voto negativo. Non è il tuo compito decidere quali domande e risposte hanno il diritto di essere su questo sito, e non è certamente il tuo compito modificare le risposte di altri utenti al punto che il loro significato è cambiato drasticamente.
reach4thelasers

1

Per coloro che desiderano salvare un modello, senza aggiornare gli attributi, è possibile eseguire le seguenti operazioni:

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

1

Nella funzione di inizializzazione, associa il metodo di sincronizzazione a un metodo definito (onSaveSuccess)

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

In questo modo, ogni volta che esegui this.model.save (), verrà eseguita la funzione onSaveSuccess come callback se la sincronizzazione ha esito positivo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.