Обновление коллекции 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 и проверить там наличие модели