2011-10-24 18 views

Respuesta

3

Lo que está buscando es, probablemente, que los modelos sean recogidos. Es decir, que ya nadie hace referencia a estos modelos una vez que se eliminan de la colección.

Backbone hace su parte de eliminar las referencias que establece en los modelos, cuando se eliminan de la colección. Sin embargo, debe hacer su propia limpieza si su código tiene referencias a esos modelos. La mayoría de las veces, esto sucede si esos modelos están registrados como detectores de eventos, como en este ejemplo: http://jsfiddle.net/dira/4uxp4/2/

Echando un vistazo a the implementation of reset, podría cambiar _removeReference para llamar a una función de limpieza en el modelo también. Y en el modelo, elimine el modelo de todos los oyentes/todos los demás objetos que lo sigan haciendo referencia.

+2

No invalide ni cambiar los métodos o propiedades de subrayado prefijada. Vea mi respuesta a continuación para una explicación. –

3

Puede escuchar el evento reset del modelo y hacer su limpieza y this.destroy() en respuesta. Para eso son los ganchos del evento. Ver http://backbonejs.org/#Events-catalog

Nota: No debe cambiar ni anular ningún método o propiedad con el guión bajo, como _removeReference. Los guiones bajos significan que está pensado como un método interno o propiedad, y que las implementaciones internas pueden cambiar (sus API se consideran inestables). La actualización de Backbone podría romper cualquier código que dependa de métodos con guiones bajos, incluso si el lanzamiento se publicita como un cambio compatible con versiones anteriores.

Sé que su pregunta dice "sin iterar", pero realmente es la forma más confiable de manejar esto. Considere un caso en el que un modelo se ha movido de una colección a otra, pero todavía está escuchando en el evento de la primera colección reset (porque un programador seis meses después no se dio cuenta de la conexión).

Ahora cuando se restablece la primera colección, el modelo movido se destruye. Oops!

Iterar la colección probablemente sea la mejor manera de manejar esto si no tiene un punto final en su API que eliminará todos los objetos de una colección en lote en el servidor API (que a menudo es cómo se maneja esto) .

Por suerte, esa iteración es bastante fácil:

destroyAll: function() { 
    var promises = []; 

    while(this.models.length > 0) { 
    promises.push(this.models[0].destroy()); 
    } 

    // handle errors communicating with the server 
    $.when(promises).fail(function (response) { 
    this.trigger('syncError', 
     response); 
    }.bind(this)); 
} 
+0

this.models [0] no funcionó para mí, this.models.first() did –

Cuestiones relacionadas