2011-08-17 10 views
10

Tengo una aplicación que consiste en una colección Backbone.js y conexión en tiempo real al servidor.Actualizar una colección Backbone.js sin borrar los modelos anteriores

Cada vez que un cliente agrega/quita/actualiza un modelo en la colección, la colección actualizada se transmite a todos los demás clientes (no al delta, toda la colección).

Al manejar este evento de actualización de los otros clientes, la única forma que he encontrado de actualizar la colección es un reinicio(). Desafortunadamente, esto borra los modelos antiguos y crea otros nuevos, junto con todos los efectos secundarios relacionados con la vista.

¿Existe alguna manera sancionada por Backbone de actualizar una colección que mantiene y actualiza los modelos originales (comparando por id), creando/borrando solo si es necesario?

ACTUALIZACIÓN Backbone ha agregado el método Collection.set, que es capaz de actualizar los modelos existentes.

+0

relacionadas: https://github.com/documentcloud/backbone/issues/955 – philfreo

Respuesta

8

La solución fui con es:

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

Genial. Solo una cosa ... agregue 'devolver esto;' al final. Los métodos de Backbone siempre devuelven su objeto de contexto para que pueda encadenarlos ('my_col.update (x) .toJSON()'). – Jake

+0

Hecho. Gracias, Jake. –

0

cuando agrega un modelo a la colección, se invoca 'agregar' devolución de llamada. Haz uso de eso en lugar de reiniciar.

+1

Si solo se emitiera el estado delta en el cambio (por ejemplo, 'se agregó/eliminó/actualizó el modelo A'), esta sería la solución correcta. Sin embargo, toda la colección se retransmite en lugar de una a la vez, por lo que la pregunta es cómo conservar las instancias originales de los modelos existentes. –

0

Se puede extender el método de recogida add y comprobar allí para el modelo de existencia

Cuestiones relacionadas