Rückgrat.Modell.sparen Sie nicht mein Modell mit der server-Antwort
Ich bin Aufruf von 'speichern unter' auf mein Modell und der Rückkehr das neue Modell als json in meinem PHP-backend. Wenn ich Schritt für Schritt durch das Rückgrat.Modell.save-Methode kann ich sehen, dass es erfolgreich wird der server-Antwort und stellt dann das Modell (in den Optionen.Erfolg Schließung unten). Wenn aber die Ausführung ist wieder auf meiner click-handler, das Modell hat die alten Eigenschaften (dh. die id ist nicht gesetzt). Was könnte passiert sein?
Hier ist mein click-handler:
addButtonClick: function(e) {
var data = $(e.target).closest('form').serializeObject();
var p = new Domain.Page; //this extends Backbone.Model
p.set(data);
p.save();
//****
//**** AFTER p.save, the model p still has the OLD ATTRIBUTES... why??
//****
return false;
}
Hier ist Rückgrat der save-Methode:
//Set a hash of model attributes, and sync the model to the server.
//If the server returns an attributes hash that differs, the model's
//state will be `set` again.
save : function(attrs, options) {
options || (options = {});
if (attrs && !this.set(attrs, options)) return false;
var model = this;
var success = options.success;
options.success = function(resp, status, xhr) {
//****
//**** NEXT LINE SUCCESSFULLY SETS THE MODEL WITH THE SERVER RESPONSE
//****
if (!model.set(model.parse(resp, xhr), options)) return false;
if (success) success(model, resp, xhr);
};
options.error = wrapError(options.error, model, options);
var method = this.isNew() ? 'create' : 'update';
return (this.sync || Backbone.sync).call(this, method, this, options);
},
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
save
Methode ist asynchron. In anderen Worten, diemodel.set
Aufruf innerhalbsave
passiert, nachdem der server geantwortet hat.Werden Sie Fragen, warum die Werte sind die gleichen, die sofort nach
save
genannt wird. Die Antwort ist: an diesem Punkt in der Zeit, die Antwort ist nicht empfangen worden, die von Ihrem code noch. Der Rückruf wurde noch nicht genannt.model.set
wurde noch nicht genannt.Wenn Sie weiterhin auf und der event-Schleife wird die Antwort von dem server (dies kann ein Bruchteil einer Sekunde, es kann mehrere Sekunden) später, deine Werte raus.
save
. Ich kann mit 100% Sicherheit sagen, dass Ihre Werte nicht gesetzt werden, doch an diesem Punkt. Aber Sie sagen, dass nach derset
Anruf getätigt wird, werden die Werte gesetzt sind, aber die Referenz, die Sie überprüfen, die sich nicht geändert hat. Sie müssen festhalten an der falschen Verweis.Ich denke, dass ich herausgefunden, was falsch war hier. Und Brian waren Sie Recht zu sagen, es hatte etwas zu tun mit der asynchronen Natur des Rückgrats.sparen rufen. Die Sache ist, dass ich mit dem DEBUGGER. Dies Stoppt die Ausführung. Ich eigentlich nicht wirklich verstehen, wie man einen asynchronen Aufruf funktioniert unter der Haube, vielleicht mit threads? Ich nahm an, dass, nachdem ich Schritt über den Aufruf von 'speichern unter' und dann wartete eine Sekunde, dann ist der asynchrone Teil (was auch immer das ist) von der "save" - Aufruf im hintergrund ausführen. Aber dies ist nicht der Fall. Der debugger Stoppt alles. Also die Optionen.Erfolg Schließung innerhalb von 'speichern' immer aufgerufen wird irgendwann nach seinem Rücktritt über "speichern". Kurz gesagt, diese ganze Sache ist durch mich nicht zu verstehen, javascript und javascript-debugging richtig.