Wie löse ich den Erfolgsrückruf auf einem model.save () aus?


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

Das Modell wird korrekt an den Server gesendet, der das Speichern übernimmt, aber der erfolgreiche Rückruf wird nicht ausgelöst. Muss ich etwas vom Server zurücksenden?


7
Es stellte sich heraus, dass ich es falsch gemacht habe: Die richtige Syntax sollte lauten: this.model.save (newItem, {success: ..., error: ...})
— Running Turtle

8
'null' scheint auch als Platzhalter in Ordnung zu sein.
— UpTheCreek

@ UpTheCreek Danke. Das hat geholfen. Ich schaute auf die Quelle und übergab eine leere Zeichenfolge als Schlüssel und Wert. Mag deine Methode aber besser.
— Pramod

@UpTheCreek null hat bei mir aus irgendeinem Grund nicht funktioniert, aber das Übergeben eines leeren attr obj hat funktioniert :)
— KoalaKid

Antworten:


123

Das erste Argument für save sind die Attribute, die im Modell gespeichert werden sollen:

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

9
Ich bin ein bisschen verwirrt - (1) Ich dachte, dass das Backbone beim Speichern immer das gesamte Modell zurückschickt (dass es nicht möglich ist, teilweise Modellaktualisierungen zu senden). Was ist also der Zweck der Attributnamenwerte? (2) Was ist, wenn Sie das Modell nur speichern möchten, nachdem Sie einige .set () s ausgeführt haben - warum die Attributliste? (3) In den Dokumenten wird der Attributlistenparameter als optional angezeigt. Könntest Du das erläutern? Vielen Dank.
— UpTheCreek

7
Sie können eine Reihe von "Sätzen" mit Ihren Attributen durchführen und dann ohne Attribute speichern. Alle Attribute des Modells werden immer an den Server gesendet. Speichern mit Attributen ist nur eine Verknüpfung zum Festlegen + Speichern.
— Julien

5
So albern es auch scheint, genau das tut es, schade, dass es schlecht dokumentiert ist.
— Kevin

51
In meinen Tests scheint es, dass die Erfolgs- und Fehlerrückrufe nicht ausgelöst werden, wenn Sie nichts für den Parameter "Attribute" übergeben. Dies scheint der Dokumentation zu widersprechen ... model.save ([Attribute], [Optionen]) würde anzeigen, dass Attribute optional sind. Wenn ich Attribute oder null für die Attribute einbinde, werden meine Erfolgs- und Fehlerrückrufe ausgelöst. Wenn ich nichts für die Attribute einbinde, werden die Rückrufe NICHT ausgelöst.
— Kevin

6
überprüfte den Quellcode von backbone.js [ backbonejs.org/docs/backbone.html ]. Es scheint, dass das attr obligatorisch ist. Wenn nur 'Option' bereitgestellt wird, nehmen die Funktionen an, dass es das 'attr' ist, und bringen den Aufruf durcheinander
— Kumaresan

58

Aus irgendeinem unbekannten Grund funktionierte keine der oben genannten Methoden für mich. Die API wurde in meinem Fall nur nicht getroffen.

Aber später, als ich danach suchte, stieß ich auf diesen Link , den jemand versucht hatte, nullanstatt {}als erster Parameter.

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

Das hat bei mir funktioniert. Hoffe das hilft dir auch.


3
Dies ist die richtige Antwort. Wenn Sie null übergeben, sendet Backbone alle Attribute zum Speichern an den Server.
— Paul Oliver

Seltsame Eigenart, aber meine gewählte Methode.
— Matt Fletcher

37

Ihr Server muss ein JSON-Objekt zurückgeben. Wenn die Antwort kein JSON-Objekt ist, werden die Rückrufe nicht ausgelöst.

Wenn Ihr Server für den Erfolg kein JSON-Objekt zurückgibt, führen Sie eine Speicherung mit der Option dataType: "text" wie folgt durch :

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

Mit dieser Option wartet es nicht auf einen JSON als Antwort, sondern auf einen Text, und somit wird der Rückruf gestartet.


Heiliger Mist, danke. Das hat mich verrückt gemacht. Wäre großartig, wenn dies irgendwo in den Backbone-Dokumenten dokumentiert wäre
— Tobias J

das hat meinen Arsch gerettet. Ich habe res.json ({success: result}) mit Express 4 verwendet, und das gab mir immer noch Probleme. Vielleicht muss ich tun: res.json ({"success": "result"}) oder so ...
— Alexander Mills

Vielen Dank! Das machte meinen Tag.
— Alcfeoh

11

Sie können den Unterstrich lib wie folgt verwenden, da das Backbone bereits davon abhängt. Denken Sie daran, dass das erste Argument von save entweder Attribute haben muss oder dass Sie einfach {} übergeben können, falls Sie das Modell selbst speichern möchten.

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

8

Ich bin also ein wenig verwirrt. Muss ich noch alle Attribute übergeben, damit ich ein Sicherungsereignis aufrufen kann? Was ist, wenn mein Modell groß ist? Ich möchte nicht jede Eigenschaft manuell festlegen

Ich rufe model.save auf und versuche Folgendes zu tun:

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

ok, nur um meine eigene Frage zu beantworten, falls jemand diesen Beitrag findet, habe ich Folgendes getan, was funktioniert:

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

BEARBEITEN: Ich konnte Ihnen aus irgendeinem Grund nicht antworten, aber ich kann bearbeiten

Sie müssen jedoch keine ID festlegen: this.model.get('id')Sie können einfach ein leeres Objekt übergeben, da ein leeres Attribut die Attribute nicht erweitert und nichts bewirkt:

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

4

Das Folgende ist der Code, den ich zum Speichern des Backbone-Modells verwende.

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

Prost

Roy MJ


Es ist etwas ablenkend, einen Einheimischen modelan einen this.model.. modelzu übergeben attributes, der zusammen mit allem inthis.model
— Funkodebat

@Funkodebat: Ja. :) .. Ich dachte eigentlich, dass dies ähnlich wie normales jquery-ajax ist, aber in Backbone wäre der erste Parameter das Modell. Nicht unbedingt weitergeben, sondern das entsprechende bekommen. Es ist in der Tat ziemlich beunruhigend .. :(
— Roy MJ

Die Wahrheit ist, nein, Sie übergeben das Modell nicht, wenn Sie save aufrufen. Das erste Argument für save sind zusätzliche Attribute, die Sie festlegen können, bevor Sie save aufrufen. Es wäre wie ein Anruf model.set(model.toJSON()); model.save(). Es gibt keinen Grund, ein Modell auf das zu setzen, auf das das Modell eingestellt ist. Es ist der Inbegriff von Redundanz, ein Modell beim Speichern an sich selbst zu übergeben.
— Funkodebat

2
@Funkodebat Ich habe Ihre Änderungen an dieser 3 Jahre alten Antwort abgelehnt, da sie die Antwort des Autors radikal geändert haben. Dies ist nicht die Absicht des Bearbeitungs- / Moderationssystems. Wenn die Antwort nicht mehr relevant oder angemessen ist, stimmen Sie ab und schreiben Sie eine neue. Die Moderationstools dienen zum Korrigieren von Grammatik, Formatieren, Rechtschreibung und Großschreibung - nicht zum Anpassen der Antworten anderer Benutzer.
— erreichen4thelasers

2
Die Community würde Ihnen nicht zustimmen. Es ist eine hoch bewertete Frage mit einer hoch bewerteten Top-Antwort. Die Frage scheint für die Community relevant zu sein. Wenn Sie mit etwas nicht einverstanden sind, verwenden Sie den Abstimmungsknopf. Es ist nicht Ihre Aufgabe, zu bestimmen, welche Fragen und Antworten auf dieser Website berechtigt sind, und es ist sicherlich nicht Ihre Aufgabe, die Antworten anderer Benutzer so zu ändern, dass sich ihre Bedeutung drastisch ändert.
— erreichen4thelasers

1

Für diejenigen, die ein Modell speichern möchten, ohne die Attribute zu aktualisieren, können Sie Folgendes tun:

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

1

Binden Sie beim Initialisieren der Funktion die Synchronisierungsmethode an eine von Ihnen definierte Methode (onSaveSuccess).

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

Auf diese Weise wird jedes Mal, wenn Sie this.model.save () ausführen, die Funktion onSaveSuccess als Rückruf ausgeführt, wenn Ihre Synchronisierung erfolgreich ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.