backbone.js länge - Wie trigge ich den Erfolgsrückruf bei einer model.save () an?





meta description (8)


also bin ich ein wenig verwirrt - muss ich noch alle Attribute übergeben, damit ich ein sicheres Ereignis aufrufen kann? Was ist, wenn mein Modell groß ist? Ich möchte nicht jede Eigenschaft manuell einstellen

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, wenn 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");
        }
    });

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

aber Sie müssen keine ID setzen: this.model.get('id') Sie können einfach ein leeres Objekt übergeben, weil ein leeres Attribut nur keine Attribute erweitert, tut nichts:

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

Das Modell wird ordnungsgemäß auf dem Server veröffentlicht, der das Speichern behandelt, aber der Erfolgsrückruf wird nicht ausgelöst. Muss ich etwas vom Server zurücksenden?




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 , wo null anstelle von {} als ersten Parameter versucht hatte.

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

Also, das hat für mich funktioniert. Hoffe das hilft dir auch.




Sie können die Unterstrichbibliothek wie folgt verwenden, da das Rückgrat bereits davon abhängt. Denken Sie daran, dass das erste Argument von save entweder Attribute haben muss oder Sie einfach {} übergeben, wenn 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))



Das erste Argument von save sind die Attribute, die im Modell gespeichert werden sollen:

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



Der folgende Code ist der Code, den ich für die Sicherung des Backbone-Modells verwende.

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

Prost

Roy MJ




In der Initialisierungsfunktion binden Sie 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 bei jeder Ausführung von this.model.save () die onSaveSuccess-Funktion als Callback ausgeführt, wenn die Synchronisierung erfolgreich ist




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

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

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

Mit dieser Option wird nicht auf ein JSON als Antwort gewartet, sondern ein Text und damit der Callback gestartet.




"inspiriert" in hyong antworten.

Dies ermöglicht Ihnen auch, die Daten vor dem Vergleich zu ändern, valueTransforms ist ein Objekt, wenn es ein Attribut in dem Objekt gibt, das eine Funktion hat, wird es verwendet.

    /*
     * @param {Object} sortOrders ie: 
     * {
     *     "description": "asc",
     *     "duedate": "desc",
     * }
     * @param {Object} valueTransforms
     */
    setMultiFieldComparator: function(sortOrders, valueTransforms) {
        var newSortOrders = {}, added = 0;
        _.each(sortOrders, function(sortOrder, sortField) {
            if (["asc", "desc"].indexOf(sortOrder) !== -1) {
                newSortOrders[sortField] = sortOrder;
                added += 1;
            }
        });
        if (added) {
            this.comparator = this._multiFieldComparator
                .bind(this, newSortOrders, valueTransforms || this.model.prototype.valueTransforms || {});
        } else {
            this.comparator = null;
        }
    },

    _multiFieldComparator: function(sortOrders, valueTransforms, one, another) {
        var retVal = 0;
        if (sortOrders) {
            _.every(sortOrders, function(sortOrder, sortField) {
                var oneValue = one.get(sortField),
                    anotherValue = another.get(sortField);
                if (valueTransforms[sortField] instanceof Function) {
                    oneValue = valueTransforms[sortField](oneValue);
                    anotherValue = valueTransforms[sortField](anotherValue);
                }
                if (oneValue > anotherValue) {
                    retVal = ("desc" !== sortOrder) ? 1 : -1;
                } else if (oneValue < anotherValue) {
                    retVal = ("desc" !== sortOrder) ? -1 : 1;
                } else {
                    //continue
                    return true;
                }
            });
        }
        return retVal;
    },




backbone.js