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


106
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 depuis le serveur?


7
Il s'avère que je faisais mal: la syntaxe correcte devrait être: this.model.save (newItem, {success: ..., error: ...})
Exécution de Turtle

8
«null» semble également fonctionner correctement comme espace réservé.
UpTheCreek

@UpTheCreek Merci. Cela a aidé. J'ai regardé la source et passé une chaîne vide comme clé et valeur. Aimez mieux votre méthode.
Pramod

@UpTheCreek null n'a pas fonctionné pour moi pour une raison quelconque, mais passer un obj attr vide l'a fait :)
KoalaKid

Réponses:


123

Le premier argument de save est les attributs à sauvegarder sur le modèle:

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

9
Je suis un peu confus - (1) Je pensais que le backbone renvoyait toujours le modèle entier pendant la sauvegarde (qu'il n'est pas possible d'envoyer des mises à jour partielles du modèle). Alors, quel est le but des valeurs de nom d'attribut? (2) Que faire si vous voulez juste enregistrer le modèle après avoir exécuté des .set () s - pourquoi la liste d'attributs? (3) Dans la documentation, le paramètre de liste d'attributs est indiqué comme facultatif. Pouvez-vous clarifier? Merci.
UpTheCreek

7
Vous pouvez faire un tas de "set" avec vos attributs et ensuite faire une sauvegarde sans aucun attribut. Tous les attributs du modèle sont toujours envoyés au serveur. Enregistrer avec les attributs n'est qu'un raccourci pour définir + enregistrer.
Julien

5
Aussi stupide que cela puisse paraître, c'est exactement ce qu'il fait, dommage que ce soit mal documenté.
Kevin

51
Il apparaît dans mes tests que les rappels de succès et d'erreur ne sont pas déclenchés si vous ne passez pas quelque chose pour le paramètre "attributs". Cela semble contredire la documentation ... model.save ([attributs], [options]) indiquerait que les attributs sont facultatifs. Lorsque j'inclus des attributs ou null pour les attributs, mes rappels de succès et d'erreur sont déclenchés. Lorsque je n'inclus rien pour les attributs, les rappels ne sont PAS déclenchés.
Kevin

6
vérifié le code source de backbone.js [ backbonejs.org/docs/backbone.html ]. il semble que l'attr soit obligatoire .. si seulement 'option' est fournie, les fonctions supposent qu'il s'agit de 'attr' et
gâchent

58

Pour certains inconnus raison , aucune des méthodes ci-dessus n'a fonctionné pour moi. L'API seulement n'a pas été touchée dans mon cas.

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

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

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


3
C'est la bonne réponse. Si vous transmettez null, Backbone enverra tous les attributs au serveur pour enregistrement.
Paul Oliver

Bizarrerie étrange mais ma méthode choisie.
Matt Fletcher

37

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 renvoie pas d'objet JSON, effectuez un enregistrement avec l' option dataType: "text" , comme ceci:

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

Avec cette option, il n'attendra pas un JSON en réponse, mais un texte, et ainsi le rappel sera lancé.


Putain de merde merci. Cela me rendait dingue. Ce serait génial si cela était documenté quelque part dans la documentation de Backbone,
Tobias J

cela m'a sauvé le cul. J'utilisais res.json ({success: result}) avec Express 4, et cela me posait encore des problèmes. Peut-être que je dois faire: res.json ({"success": "result"}) ou quelque chose ...
Alexander Mills

Merci beaucoup! Cela a fait ma journée.
alcfeoh

11

Vous pouvez utiliser la librairie de soulignement comme suit car la colonne vertébrale en dépend déjà. N'oubliez pas que le premier argument de sauvegarde doit avoir des attributs ou vous pouvez simplement passer {} au cas où vous voudriez enregistrer le modèle lui-même.

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

8

Je suis donc un peu confus - dois-je encore passer tous les attributs pour que j'appelle un événement de sauvegarde? que faire si mon modèle est grand ... je ne souhaite pas définir chaque propriété manuellement

Im appelant model.save et essayant de faire ce qui 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 trouverait ce message, j'ai fait ce qui suit qui fonctionne:

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

EDIT: Je n'ai pas pu vous répondre pour une raison quelconque, mais je peux modifier

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 n'étend tout simplement pas les attributs, ne fait rien:

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

4

Ce qui suit est le code que j'utilise pour la sauvegarde du modèle backbone.

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

À votre santé

Roy MJ


il est quelque peu distrayant de passer un local modelà un this.model.. modeldevrait être attributes, qui sont définis et enregistrés avec tout ce qui se trouve dansthis.model
Funkodebat

@Funkodebat: Oui. :) .. Je pensais en fait que c'était similaire à jquery-ajax normal, mais dans Backbone, le premier paramètre serait le modèle. Pas nécessairement en passant, mais plutôt en obtenant le correspondant. C'est assez dérangeant en effet .. :(
Roy MJ

Eh bien, la vérité est que non, vous ne passez pas le modèle lors de l'appel de sauvegarde. le premier argument de save est des attributs supplémentaires que vous pouvez définir avant d'appeler save. Ce serait comme appeler model.set(model.toJSON()); model.save(). il n'y a aucune raison de définir un modèle sur ce à quoi le modèle est défini .. c'est la quintessence de la redondance de passer un modèle à lui-même lors de l'enregistrement.
Funkodebat

2
@Funkodebat J'ai rejeté vos modifications de cette réponse de 3 ans car elles ont radicalement changé la réponse de l'auteur. Ce n'est pas l'intention du système d'édition / de modération. Si la réponse n'est plus pertinente ou appropriée, votez contre et écrivez-en une nouvelle. Les outils de modération servent à corriger la grammaire, le formatage, l'orthographe et les majuscules - pas pour ajuster les réponses des autres utilisateurs.
reach4thelasers

2
La communauté ne serait pas d'accord avec vous. C'est une question hautement votée avec une réponse hautement votée. La question semble pertinente pour la communauté. Si vous n'êtes pas d'accord avec quoi que ce soit, utilisez le bouton de vote négatif. Ce n'est pas à vous de dicter quelles questions et réponses ont le droit d'être sur ce site, et ce n'est certainement pas à vous de modifier les réponses des autres utilisateurs au point que leur signification soit radicalement modifiée.
reach4thelasers

1

Pour ceux qui souhaitent enregistrer un modèle, sans mettre à jour les attributs, vous pouvez effectuer les opérations suivantes:

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

1

Lors de l'initialisation de la fonction, liez la méthode de synchronisation à 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();
            },

De cette façon, chaque fois que vous exécutez this.model.save (), il exécutera la fonction onSaveSuccess comme un rappel si votre synchronisation est réussie

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.