Лучший способ сохранить всю коллекцию?
-
14-11-2019 - |
Вопрос
Допустим, у меня есть коллекция и я внес изменения во многие ее модели.Как лучше всего сохранить все изменения с помощью одного HTTP-запроса?
Решение
Обычно отдохнуть бэкэндс ручки одного экземпляра Создание / обновление.Вам нужно будет изменить это, чтобы принять массив объектов.
, который сказал, на стороне клиента вам нужно будет перейти непосредственно к функции Backbone.sync
Backbone.sync = function(method, model, options)
.
В этом случае ваша модель должна быть массивом модели.Метод должен быть «создать» или «Сохранение», и параметры принимают один и тот же тип опций, что и jQuery Ajax Call (ошибка, успех и т. Д.)
Другие советы
Я собираюсь сделать неправильную вещь и процитировать Википедию относительно правильные практики RESTful:а ПОМЕЩАТЬ к example.com/resources
следует заменить всю коллекцию другой коллекцией.Исходя из этого, когда нам пришлось поддерживать редактирование нескольких элементов одновременно, мы заключили этот контракт.
- Клиент отправляет
{"resources": [{resource1},{resource2}]}
- Сервер заменяет всю коллекцию новой информацией от клиента и возвращает информацию после ее сохранения:
{"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
.