web-dev-qa-db-fra.com

Comment déclencher le rappel de succès sur un model.save ()?

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

Le modèle est correctement publié sur le serveur qui gère la sauvegarde, mais le rappel de réussite n'est pas déclenché. Dois-je renvoyer quelque chose du serveur?

106
Running Turtle

Le premier argument de save correspond aux attributs à enregistrer sur le modèle:

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

Pour certaines raisons inconnues , aucune des méthodes ci-dessus n'a fonctionné pour moi. L'API seulement n'a pas été touché dans mon cas.

Mais plus tard, en cherchant cela, je suis tombé sur ce lien , où quelqu'un avait essayé null au lieu de {} comme premier paramètre.

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

alors, cela a fonctionné pour moi. J'espère que ça va t'aider aussi.

58
Yasser

Votre serveur doit renvoyer un objet JSON. Si la réponse n'est pas un objet JSON, les rappels ne seront pas déclenchés.

Si, pour réussir, votre serveur ne retourne pas d'objet JSON, effectuez une sauvegarde avec l'option dataType: "text", comme ceci:

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

Avec cette option, il ne sera pas en attente d'un JSON en réponse, mais d'un texte, et donc le rappel sera lancé.

37
Igor G.

Vous pouvez utiliser le soulignement lib comme suit, car votre réseau en dépend déjà. Rappelez-vous que le premier argument de save doit avoir des attributs ou vous pouvez simplement passer {} si vous voulez sauvegarder le modèle lui-même.

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

je suis donc un peu confus. Dois-je toujours passer tous les attributs pour pouvoir appeler un événement de sauvegarde? Et si mon modèle est grand, je ne souhaite pas définir chaque propriété manuellement

im appelle model.save et tente de procéder comme suit:

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

ok juste pour répondre à ma propre question au cas où quelqu'un trouve ce post, j'ai fait ce qui suit:

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

EDIT: Je ne peux pas vous répondre pour une raison quelconque, mais je peux éditer

mais vous n'avez pas besoin de définir id: this.model.get('id') vous pouvez simplement passer un objet vide car un attribut vide ne prolongera pas les attributs, ne fait rien:

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

Ce qui suit est le code que j'utilise pour sauvegarder le modèle de réseau principal.

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

À votre santé

Roy M J

4
Roy M J

Dans votre fonction d’initialisation, liez la méthode sync à une méthode que vous définissez (onSaveSuccess)

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

Ainsi, chaque fois que vous exécuterez this.model.save (), la fonction onSaveSuccess sera exécutée en tant que rappel si votre synchronisation est réussie.

1
Peter Graham

Pour ceux qui souhaitent enregistrer un modèle, sans mettre à jour les attributs, vous pouvez procéder comme suit:

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