Вопрос

Допустим, у меня есть коллекция и я внес изменения во многие ее модели.Как лучше всего сохранить все изменения с помощью одного HTTP-запроса?

Это было полезно?

Решение

Обычно отдохнуть бэкэндс ручки одного экземпляра Создание / обновление.Вам нужно будет изменить это, чтобы принять массив объектов.

, который сказал, на стороне клиента вам нужно будет перейти непосредственно к функции Backbone.sync

Backbone.sync = function(method, model, options)
.

В этом случае ваша модель должна быть массивом модели.Метод должен быть «создать» или «Сохранение», и параметры принимают один и тот же тип опций, что и jQuery Ajax Call (ошибка, успех и т. Д.)

Другие советы

Я собираюсь сделать неправильную вещь и процитировать Википедию относительно правильные практики RESTfulПОМЕЩАТЬ к example.com/resources следует заменить всю коллекцию другой коллекцией.Исходя из этого, когда нам пришлось поддерживать редактирование нескольких элементов одновременно, мы заключили этот контракт.

  1. Клиент отправляет {"resources": [{resource1},{resource2}]}
  2. Сервер заменяет всю коллекцию новой информацией от клиента и возвращает информацию после ее сохранения: {"resources": [{"id":1,...},{"id":2,...}]}

Мы написали серверную половину контракта на Rails, а вот клиентская половина (извините, на CoffeeScript!):

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

Я думал, что это много проще реализовать, чем переопределить Backbone.sync.Один комментарий к коду: наши коллекции всегда были дочерними объектами, что должно объяснить, почему код устанавливает «parent_id» всякий раз, когда объект добавляется в коллекцию, и почему корневым URL-адресом является URL-адрес родительского объекта.Если у вас есть коллекции корневого уровня, которые вы хотите изменить, просто удалите @parent бизнес.

Вам следует продлить Backbone.Collection, придавая этому save() метод, который проверял бы каждую из своих моделей hasChanged().

Тогда он должен позвонить Backbone.sync, которую вам, вероятно, придется немного расширить до специальной функции синхронизации.Если вы используете пользовательский Backbone.sync функцию, затем обязательно установите ее в свою коллекцию.

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
    }
});

Другой подход (с использованием модели для представления коллекции) находится здесь: «Как» сохранить всю коллекцию в Backbone.js — Backbone.sync или jQuery.ajax?

Мне также нравится https://stackoverflow.com/a/7986982/137067

Этот код добавляет новый метод для прототипа сбора, просто для вызова метода сохранения этих моделей, которые изменились.Это работало для меня:

Backbone.Collection.prototype.saveAll = function(options) {
 return $.when.apply($, _.map(this.models, function(m) {
   return m.hasChanged() ? m.save(null, options).then(_.identity) : m;
 }));
};
.

Gist Link: https://gist.github.com/julianitor/701c677279bac1529b88

.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top