7

Tengo curiosidad por saber por qué restablecer una colección de red troncal no activa un evento modelo. Sin embargo, parece lógico disparar un evento modelo cuando un modelo se elimina físicamente de una colección.Backbone: ¿por qué un collection.reset no desencadena un evento modelo?

¿Esto es intencional o me falta algo? Si la columna vertebral no hace este tipo de cosas, es una buena práctica para delegar eventos de ese modo.

¿Por qué la red troncal no activa un evento modelo cuando se restablece su colección?

var TicketModel = Backbone.Model.extend({ 
    defaults: { 
     name: 'crafty', 
     email: '[email protected]' 
    }, 
    initialize: function(){ 
     this.on("all", function(event){ 
      console.log(event) 
     }); 
    } 

}); 

var TicketCollection = Backbone.Collection.extend({ 
    model: TicketModel, 

    }); 


var tickets = new TicketCollection([ 
    { 
     name: 'halldwq' 
    }, 
    { 
     name: 'dascwq' 
    }, 
    { 
     name: 'dsacwqe' 
    } 

]); 

tickets.reset(); 
+0

es suficiente, si eso lo hace más claro, gracias rimian – nimrod

Respuesta

16

Anulación El método Backbone puede causar problemas al actualizar a otra versión.

Backbone almacena una matriz de los modelos antes del restablecimiento de options.previousModels, por lo que sólo escuchar el evento de restauración y desencadenar un evento de 'eliminar' en los modelos anteriores:

collection.on('reset', function(col, opts){ 
    _.each(opts.previousModels, function(model){ 
     model.trigger('remove'); 
    }); 
}); 

Eso haría lo truco.

16

Esta es la función de restablecimiento columna vertebral:

reset: function(models, options) { 
    models || (models = []); 
    options || (options = {}); 
    for (var i = 0, l = this.models.length; i < l; i++) { 
    this._removeReference(this.models[i]); 
    } 
    this._reset(); 
    this.add(models, _.extend({silent: true}, options)); 
    if (!options.silent) this.trigger('reset', this, options); 
    return this; 
}, 

Podemos ignorar las últimas 3 líneas porque no se proporciona ningún modelo para el restablecimiento de funciones. También ignoremos las primeras 2 líneas también. Así primer bucle que a través de los modelos de esta colección y llamar al método de la colección _removeReference(model), que se ve así:

_removeReference: function(model) { 
    if (this == model.collection) { 
    delete model.collection; 
    } 
    model.off('all', this._onModelEvent, this); 
}, 

Lo que sucede aquí es que estamos eliminando la colección propiedad del objeto de modelo completo y también retirar el enlace a los eventos de este modelo. Lo siguiente que llamamos _reset() -función de la colección, que se ve así:

_reset: function(options) { 
    this.length = 0; 
    this.models = []; 
    this._byId = {}; 
    this._byCid = {}; 
}, 

Se recoge un poco de plano cualquier referencia a cualquiera de los modelos de la colección ha tenido.

¿Qué podemos hacer con esto? Bueno, la colección reset -función en Backbone básicamente solo evita todos los canales oficiales de eliminación de modelos y lo hace todo en silencio secreto, no causando más eventos que reset para ser despedido. Entonces, ¿desea activar el evento remove del modelo para cada modelo eliminado de una colección durante el reinicio? ¡Fácil! Simplemente sobrescribir Backbone.Collection función de reinicio como este:

var Collection = Backbone.Collection.extend({ 
    reset: function(models, options) { 
    models || (models = []); 
    options || (options = {}); 

    for (var i = 0, l = this.models.length; i < l; i++) { 
     this._removeReference(this.models[i]); 
     // trigger the remove event for the model manually 
     this.models[i].trigger('remove', this.models[i], this); 
    } 

    this._reset(); 
    this.add(models, _.extend({silent: true}, options)); 
    if (!options.silent) this.trigger('reset', this, options); 
    return this; 
    } 
}); 

Hope this helps!

+0

respuesta muy completa. ¡Y agradable de leer también! ¡Muchas gracias! – nimrod

+0

no hay problema, siempre es una gran experiencia de aprendizaje para ir a través del código fuente para encontrar una solución para una pregunta como esta! – jakee

+0

Me pregunto cuál es el razonamiento detrás de esto. Un evento de 'quitar' modelos surge hasta la colección así que ¿por qué no al revés? – nimrod

Cuestiones relacionadas