Frage

Angenommen, ich habe eine Sammlung und habe an vielen ihrer Modelle Änderungen vorgenommen.Wie können alle Änderungen am besten mit einer einzigen HTTP-Anfrage gespeichert werden?

War es hilfreich?

Lösung

BESTELLUNGEN BESTLEISTUNGSBEHÖR ENGLIEREN SIE EINE INTEX-KREATION / UPDATE.Sie müssen das ändern, um ein Array von Objekten anzunehmen.

Das heißt, auf der Clientseite müssen Sie direkt zur Backbone-Funktion gehen. Sync-Funktion generasacodicetagpre.

In diesem Fall sollte Ihr Modell ein Array von Modell sein.Die Methode sollte "Erstellen" oder "Speichern" sein und die Optionen ergreifen dieselbe Art von Optionen als JQuery Ajax-Anruf (Fehler, Erfolg usw.)

Andere Tipps

Ich werde hier das Falsche tun und Wikipedia diesbezüglich zitieren richtige RESTful-Praktiken:A SETZEN Zu example.com/resources sollte die gesamte Sammlung durch eine andere Sammlung ersetzen.Auf dieser Grundlage haben wir diesen Vertrag verfasst, als wir die gleichzeitige Bearbeitung mehrerer Elemente unterstützen mussten.

  1. Der Kunde sendet {"resources": [{resource1},{resource2}]}
  2. Der Server ersetzt die gesamte Sammlung durch die neuen Informationen vom Client und gibt die Informationen zurück, nachdem sie beibehalten wurden: {"resources": [{"id":1,...},{"id":2,...}]}

Wir haben die Serverhälfte des Vertrags in Rails geschrieben, aber hier ist die Clienthälfte (in CoffeeScript, sorry!):

class ChildElementCollection extends Backbone.Collection
  initialize: ->
    @bind 'add', (model) -> model.set('parent_id', @parent.id)

  url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1'
  save: ->
    response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
    response.done (models) => @reset models.resources

Ich dachte, das wäre ein viel einfacher zu implementieren als Backbone.sync zu überschreiben.Ein Kommentar zum Code: Unsere Sammlungen waren immer untergeordnete Objekte, was erklären sollte, warum der Code immer dann eine „parent_id“ festlegt, wenn ein Objekt zur Sammlung hinzugefügt wird, und wie der Stamm der URL die URL des übergeordneten Elements ist.Wenn Sie Sammlungen auf Stammebene haben, die Sie ändern möchten, entfernen Sie einfach die @parent Geschäft.

Du solltest verlängern Backbone.Collection, gib ihm ein save() Methode, die jedes seiner Modelle überprüfen würde hasChanged().

Dann sollte es anrufen Backbone.sync, die Sie wahrscheinlich ein wenig zu einer benutzerdefinierten Synchronisierungsfunktion erweitern müssen.Wenn Sie eine benutzerdefinierte verwenden Backbone.sync Funktion, dann stellen Sie sicher, dass Sie sie in Ihrer Sammlung festlegen.

var CollectionSync = function(method, model, [options]) {
    // do similar things to Backbone.sync
}

var MyCollection = Backbone.Collection.extend({
    sync: CollectionSync,
    model: MyModel,
    getChanged: function() {
        // return a list of models that have changed by checking hasChanged()
    },
    save: function(attributes, options) {
        // do similar things as Model.save
    }
});

Ein anderer Ansatz (Verwendung eines Modells zur Darstellung der Sammlung) ist hier: „Wie“ speichere ich eine gesamte Sammlung in Backbone.js – Backbone.sync oder jQuery.ajax?

ich mag auch https://stackoverflow.com/a/7986982/137067

Dieser Code fügt dem Collection Prototyp eine neue Methode hinzu, nur um die speichernde Methode der geänderten Modelle aufzurufen.Es hat für mich funktioniert: generasacodicetagpre.

gist link: https://gist.github.com/julianitor/701c677279bac1529b88

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top