Ich bin mir sehr wohl bewusst, dass dies möglich ist, und habe mir einige Stellen angesehen (einschließlich: Best Practice zum Speichern einer gesamten Sammlung? ). Aber mir ist immer noch nicht klar, "genau wie" es in Code geschrieben ist? (Der Beitrag erklärt es auf Englisch. Es wäre toll, eine Javascript-spezifische Erklärung zu haben :)
Angenommen, ich habe eine Sammlung von Modellen - die Modelle selbst haben möglicherweise verschachtelte Sammlungen. Ich habe die toJSON () -Methode der übergeordneten Auflistung überschrieben und erhalte ein gültiges JSON-Objekt. Ich möchte die gesamte Sammlung (entsprechendes JSON) "speichern", aber das Backbone scheint nicht mit dieser Funktionalität ausgestattet zu sein.
var MyCollection = Backbone.Collection.extend({
model:MyModel,
//something to save?
save: function() {
//what to write here?
}
});
Ich weiß, irgendwo muss man sagen:
Backbone.sync = function(method, model, options){
/*
* What goes in here?? If at all anything needs to be done?
* Where to declare this in the program? And how is it called?
*/
}
Sobald die 'Ansicht' mit der Verarbeitung fertig ist, ist sie dafür verantwortlich, dass die Sammlung sich selbst auf dem Server "speichern" soll (in der Lage ist, eine Massenaktualisierungs- / Erstellungsanforderung zu verarbeiten).
Fragen, die sich stellen:
- Wie / was soll man in Code schreiben, um "alles miteinander zu verbinden"?
- Was ist der "richtige" Ort für die Rückrufe und wie kann ein "Erfolg / Fehler" -Rückruf angegeben werden? Ich meine syntaktisch? Ich bin mir nicht sicher, wie man Rückrufe im Backbone registriert ...
Wenn es tatsächlich ein kniffliger Job ist, können wir jQuery.ajax in einer Ansicht aufrufen und das this.successMethod
oder übergebenthis.errorMethod
als Erfolgs- / Fehlerrückrufe übergeben? Wird es funktionieren?
Ich muss mich mit der Denkweise von Backbone synchronisieren - ich weiß, dass mir definitiv etwas fehlt, das ganze Sammlungen synchronisiert.
quelle
Antworten:
Mein unmittelbarer Gedanke ist, die Methode zum Speichern in Backbone.Collection nicht zu überschreiben, sondern die Sammlung in ein anderes Backbone.Model zu verpacken und die toJSON-Methode dazu zu überschreiben. Dann behandelt Backbone.js das Modell als eine einzige Ressource und Sie müssen nicht hacken, wie backone zu viel denkt.
Beachten Sie, dass Backbone.Collection über eine toJSON-Methode verfügt, sodass der Großteil Ihrer Arbeit für Sie erledigt wird. Sie müssen nur die toJSON-Methode Ihres Wrappers Backbone.Model auf die Backbone.collection übertragen.
quelle
getURL(model)
das Modellargument aufruft und auch keine Art von Vergleichen durchführt ... scheint dies beabsichtigt zu seinEine sehr einfache ...
... gibt Ihren Sammlungen eine Speichermethode. Beachten Sie, dass dadurch immer alle Modelle der Sammlung auf dem Server veröffentlicht werden, unabhängig davon, was sich geändert hat. Optionen sind nur normale jQuery Ajax-Optionen.
quelle
return Backbone.sync..
Möglicherweise ist das Hinzufügen mehr Backbonish.Am Ende hatte ich nur eine 'save'-ähnliche Methode und rief $ .ajax darin auf. Es gab mir mehr Kontrolle darüber, ohne dass ich eine Wrapper-Klasse hinzufügen musste, wie von @brandgonesurfing vorgeschlagen (obwohl ich die Idee absolut liebe :) Wie bereits erwähnt, da ich die Methode collection.toJSON () bereits überschrieben hatte, war alles, was ich landete, die Verwendung im Ajax-Anruf ...
Hoffe das hilft jemandem, der darauf stößt ...
quelle
Dies hängt wirklich davon ab, was der Vertrag zwischen dem Client und dem Server ist. Hier ist ein vereinfachtes CoffeeScript-Beispiel, bei dem ein PUT
/parent/:parent_id/children
mit{"children":[{child1},{child2}]}
die Kinder eines Elternteils durch das ersetzt, was im PUT enthalten ist, und zurückgibt{"children":[{child1},{child2}]}
:Dies ist ein ziemlich einfaches Beispiel, Sie können viel mehr tun ... es hängt wirklich davon ab, in welchem Zustand sich Ihre Daten befinden, wenn save () ausgeführt wird, in welchem Zustand sie sich befinden müssen, um an den Server gesendet zu werden, und was der Server gibt zurück.
Wenn Ihr Server mit einem PUT von in Ordnung ist
[{child1},{child2]
, kann sich Ihre Backbone.sync-Zeile in ändernresponse = Backbone.sync('update', @toJSON(), url: @url(), contentType: 'application/json')
.quelle
Die Antwort hängt davon ab, was Sie mit der Sammlung auf der Serverseite tun möchten.
Wenn Sie zusätzliche Daten mit der Post senden müssen, benötigen Sie möglicherweise ein Wrapper-Modell oder ein relationales Modell .
Beim Wrapper-Modell müssen Sie immer Ihre eigene Analysemethode schreiben :
Relationale Modelle sind meiner Meinung nach besser, da Sie sie einfacher konfigurieren und mit derOption includeInJSON festlegen können, welche Attribute inden JSON eingefügt werden sollen, den Sie an Ihren Restdienst senden.
Wenn Sie keine zusätzlichen Daten senden , können Sie die Sammlung selbst synchronisieren . In diesem Fall müssen Sie Ihrer Sammlung (oder dem Sammlungsprototyp) eine Speichermethode hinzufügen :
quelle
Ich war auch überrascht, dass Backbone-Sammlungen keinen integrierten Speicher haben. Hier ist, was ich in meine Backbone-Sammlung aufgenommen habe, um dies zu tun. Ich möchte definitiv nicht jedes Modell in der Sammlung durchlaufen und unabhängig speichern. Außerdem verwende ich Backbone im Backend mithilfe von Node. Daher überschreibe ich den nativen
Backbone.sync
Code, um ihn in einer kleinen Datei in meinem kleinen Projekt zu speichern. Der Code sollte jedoch weitgehend identisch sein:quelle
save: function (options) { Backbone.sync('save', this, options); }
Alter Thread, den ich kenne, was ich letztendlich gemacht habe, ist der folgende:
Ziemlich anstrengend vorwärts :)
quelle
Hier ist ein einfaches Beispiel:
Wenn Sie die save () -Methode für Ihre Sammlung aufrufen, wird eine PUT-Methodenanforderung an die definierte URL gesendet.
quelle
Ich würde so etwas versuchen wie:
( https://stackoverflow.com/a/11085198/137067 )
quelle
Die akzeptierte Antwort ist ziemlich gut, aber ich kann noch einen Schritt weiter gehen und Ihnen Code geben, der sicherstellt, dass die richtigen Ereignisse für Ihre Listener ausgelöst werden, und Ihnen gleichzeitig die Möglichkeit gibt, Rückrufe für Ajax-Ereignisse zu übergeben:
quelle
Für alle, die 2017 noch backbone.js verwenden, funktioniert die akzeptierte Antwort nicht.
Entfernen Sie die Überschreibung toJSON () im Wrapper-Modell und rufen Sie toJSON in der Auflistung auf, wenn Sie den Modell-Wrapper instanziieren.
quelle