2012-04-03 15 views
1

Ich würde gerne in der Lage sein, save() auf einem Backbone-Modell aufrufen und das Back-End die gesamte Sammlung dieses Modells statt nur die geänderten Attribute des Modells zurückgeben. Ich würde dann Backbone mögen, um die gesamte zurückgegebene Sammlung zu aktualisieren. Der Anwendungsfall dafür ist der folgende:Speichern Backbone.js Modell und aktualisieren gesamte Collection

Ein Benutzer hat mehrere Adressen und kann eine Lieferadresse aus dieser Sammlung auswählen. Wenn sie eine andere Versandadresse aus der Sammlung wählt, sollte die vorherige Lieferadresse auf den Status "nur eine weitere einfache Adresse" aktualisiert werden. Dazu muss die gesamte Sammlung aktualisiert werden und nicht nur das geänderte Modell.

Ist das irgendwie in backbone.js möglich?

Vielen Dank im Voraus!

Antwort

4

Modelle, die an Auflistungen gebunden sind, enthalten ihre übergeordneten Auflistungen als Eigenschaft. Da Sie eine Liste von Modellen zurückgeben, können wir davon ausgehen, dass sie sich immer in einer Liste befindet.

mymodel = Backbone.Model.extend({ 
    parse: function (data) { 
    if(this.collection && typeof(data) === 'array') { 
     this.collection.reset(data); 
    } 
    return data; 
    } 
}); 
+0

nun ja, danke - das macht genau das, was ich wollte. – Hendrik

+1

"typeof (data) === 'array'" sollte stattdessen "_.isArray (data)" sein, btw. – Hendrik

1

Ja, es ist möglich. Sie verlassen nun die sync Funktion auf dem Modell

MyModel = Backbone.Model.extend({ 
    sync: function(method, model) { 
    if (method === 'create') { 
     //perform save logic and update the model's collection 
    } else if (method === 'update') { 
     //perform save logic and update the model's collection 
    } else if (method === 'read') { 
     ... 
    } else if (method === 'destroy') { 
     ... 
    } 
    } 
}); 

Werfen Sie einen Blick auf die Backbone.sync Funktion, um weitere Informationen zu überschreiben müssen.

+0

ich sync guess zwingend für diesen Anwendungsfall nicht zu viel helfen, da es nicht um die Antwort vom Server (zu, dass die Aufgabe der Erfolg Callback-Methode ist) – Hendrik

0

Was Ihr Anwendungsfall tatsächlich erfordert, ist die Aktualisierung von zwei Modellen, nicht die Aktualisierung einer ganzen Sammlung. (Anders als beim Abrufen interagieren Sammlungen nicht mit dem Server in Backbone.) Angenommen, Sie haben die Adressen A, B und C, wobei A die aktuelle Lieferadresse und C die neue Lieferadresse ist, kann Ihr Code einfach folgende Werte annehmen:

  1. Aktualisieren Sie C als neue Lieferadresse.
  2. Update A zu "nur eine andere Adresse."

Wenn Ihr Problem, dass Sie nicht wissen ist, welche Adresse die aktuelle Adresse (dh Adresse A), dann können Sie in Ihrer Sammlung suchen nur für ihn (dh „mir den aktuellen Versand geben Adresse "), aktualisieren Sie C und aktualisieren Sie dann die zurückgegebene Adresse (Adresse A).

Wenn Sie absolut müssen eine gesamte Sammlung aktualisieren (Sie nicht), Zyklus durch collection.models und aktualisieren Sie jeweils einzeln. Es gibt einfach kein Konzept im Backbone einer Sammlung, auf das REST-konform reagiert wird.

Bearbeiten: Ich habe möglicherweise Ihre Frage falsch gelesen. Wenn Sie die Sammlung auf dem Client aktualisieren möchten (d. H. Sie hatten nicht vor, die Sammlung auf dem Server zu aktualisieren), ist der Code immer noch ähnlich, Sie aktualisieren nur das alte und das neue Modell.

+0

ja ich eigentlich gemeint um die Sammlung auf dem Client zu aktualisieren, und dies ist auch das Problem mit dem obigen Ansatz, denn wenn ich C und A einfach auf ihren neuen Zustand auf dem Client aktualisieren würde, wäre ihr Zustand nicht mit dem Server synchronisiert, wenn er nicht gespeichert werden konnte auf dem Server erfolgreich. – Hendrik

2

Ich denke nicht, dass eine Überschreibung oder die Erwartungen, was zu retten ist hier zu brechen.

Es wäre einfacher, ich denke, save auf dem Modell, etwas auf den Linien außer Kraft zu setzen:

save: function (key, value, options) { 
    var p = Model.prototype.save.call(this, key, value, options), 
     self=this; 
    if (this.collection) { 
     p.done(function() { self.collection.fetch(); }); 
    } 
    return p; 
} 

, die die normale save Erhalt ihr Versprechen sparen verwenden, und dann, wenn erfolgreich sparte und das Modell Ist Teil einer Sammlung, wird die Sammlung vom Server abgerufen.

Eine andere Möglichkeit wäre, an das 10-Ereignis des Modells zu binden, zu überprüfen, ob es zu einer Sammlung gehört und es abruft, aber das würde auch unter set passieren.

+0

Ich habe es nicht versucht, aber ich denke, das würde tatsächlich mit der kleinen Unannehmlichkeit eines zusätzlichen Anfragezyklus funktionieren. – Hendrik

+0

@Hendrik Wo siehst du den zusätzlichen Zyklus? – ggozad

+0

Nun, wenn ich hier nichts verpasse, wird das Modell zuerst gespeichert und wenn das erfolgreich war, holt der Client die Sammlung. Wenn stattdessen der Server die Sammlung direkt zurückgibt, nachdem das Modell erfolgreich gespeichert wurde, benötigt die gesamte Operation eine Anforderung weniger. Liege ich falsch? – Hendrik

Verwandte Themen