Обновление коллекции Backbone.js без стирания старых моделей
У меня есть приложение, которое состоит из коллекции Backbone.js и подключения в реальном времени к серверу.
Каждый раз, когда любой клиент добавляет/удаляет/обновляет модель в коллекции, обновляемая коллекция передается всем другим клиентам (а не дельтам, всей коллекции).
При обработке этого события обновления от других клиентов единственный способ обновления коллекции - reset(). К сожалению, это стирает старые модели и создает новые, наряду со всеми связанными с представлением побочными эффектами.
Существует ли санкционированный базой способ обновления коллекции, которая поддерживает и обновляет исходные модели (сравнивая по id), создавая/удаляя их только при необходимости?
UPDATE. Магистраль добавила метод Collection.set, который способен обновлять существующие модели.
Ответы
Ответ 1
Решение, с которым я пошел, это:
Backbone.Collection.prototype.update = function(colIn){
var ids = [];
_(colIn).each(function(modIn){
var existing = this.get(modIn);
// update existing models
if (existing) { existing.set(modIn); }
// add the new ones
else { this.add(modIn); }
ids.push(modIn.id);
}, this);
// remove missing models (optional)
var toRemove = this.reject(function(model){
return _(ids).include(model.id);
});
this.remove(toRemove);
return this;
};
Ответ 2
когда вы добавляете модель в коллекцию, вызывается "add" callback. Используйте это вместо reset.
Ответ 3
Вы можете расширить метод коллекции add
и проверить там наличие модели