2016-12-08 10 views
0

Я использую Backbone.js, и у меня есть коллекции моделей. Эта коллекция извлекается и отображается на интерфейсе. В интерфейсе я хочу, чтобы пользователь удалял и добавлял новые коллекции в коллекцию.Изменения коллекции синхронизации с бэкендом

Когда пользователь закончил, и он нажал «сохранить», я хочу, чтобы вся коллекция была обновлена. Это означает, что при нажатии «save» коллекция синхронизируется (как-то). Добавлены новые модели и удалены удаленные модели.

Если я манипулировать коллекции, удаляя и добавляя модели, а затем использовать ех:

this.collection.sync() 

Будет ли удалять и добавлять модели?

+0

вопрос: вы хотите, чтобы вся коллекция была отправлена ​​в каждом сохранении? – oak

+0

Существует компромисс между количеством «вызовов клиентского сервера» и «размером вызова» и «количеством операций db». Но если вы не заботитесь обо всех этих вопросах, вы можете создать некоторую функцию на стороне сервера, которая удаляет каждую запись, не входящую в список, и добавляет к ней список. Тогда вы можете сделать 'this.collection.sync ('update', this.collection)' – oak

+0

@oak. Существует только один вызов сохранения. Поэтому я только отправлю в сборник один раз. Лучше всего сделать все в одном запросе. – TorK

ответ

0

Существует как минимум 2 способа достижения этого.

Сделать АНИ конечной точки для управления моделями

При добавлении/обновлении модели, сохраните модель непосредственно .save и когда модель удаляется, вызовите .destroy на него.

В коллекции также есть .create function, который добавляет к ней новую модель и одновременно сохраняет ее.

Лучшее, что нужно сделать в одном запросе.

Не всегда. Коллекция может быть большой, а изменения довольно малы, поэтому каждый раз вместо 100 запросов на добавление, удаление или обновление модели внутри списка происходит обмен 100 объектов с сервером.

Pros

  • Многоразовые конечные точки для управления отдельных моделей
  • Светой передачи данных, быстрее, чем отправка всей коллекции (только изменения, отправленные через частичные обновления)
  • Возможные обычное поведение для каждого действия
  • Easy обновление в режиме реального времени реализация

Против

  • Больше запросов, делая много изменений
  • Требует модели, чтобы иметь идентификаторы
  • Дополнительные конечные точки для управления
  • Не предназначен для массовых операций (за исключением всех моделей одновременно)

Поместите models массив в коллекции, в модели

Коллекции не должны быть сохранены.Вместо этого поместите models коллекции в модель, которая связывается с конечной точкой API. Эта конечная точка должна ожидать объект с полем массива, который может служить заменой серверной части коллекции.

var CollectionModel = Backbone.Model.extend({ 
    urlRoot: "collection/endpoint/" 
}); 

var myModel = new CollectionModel(); 

// ...sometime later... 

myModel.save({ 
    arrayAttribute: yourCollection.toJSON() 
}, { patch: true }); 

Доводы

  • Одна конечная точка; всегда один и тот же вызов API
  • Простая в использовании; только в одном месте, где экономия происходит

Против

  • Все модели передаются на каждый запрос, независимо от изменений
  • Может быть медленным, если коллекция является большой

Collection's .sync function является только прокси-сервером до Backbone.sync a и ничего не делать без правильных параметров. Он используется только внутри .fetch (line 1055) и не предназначен для непосредственного использования, за исключением добавления пользовательского поведения.

+0

Спасибо за ваш ответ, я ценю это! Но нет способа отправить одну модель в то время для каждого изменения. Коллекция может быть обновлена ​​только в конце, когда пользователь нажимает «сохранить». – TorK

+0

@tork, вот что представляет собой вторая часть моего ответа. –