2012-05-24 13 views
10

¿Es una mala práctica llamar al undelegateEvents() en el método de vista remove()? ¿Por qué no fue incluido por defecto por los chicos de la red troncal?La mejor forma de deshacer eventos una vez que una vista ya no es necesaria

Me di cuenta de que estoy cayendo en tantos problemas vinculantes, simplemente reiniciando una variable de vista. Aunque se llama al undelegateEvents() automáticamente cuando se crea una nueva vista, está intentando deshacer eventos para la vista recién instanciada, no la anterior. Por lo tanto, a menos que lo llame manualmente cada vez, las devoluciones de llamada fantasma continúan activas y arruinan mis aplicaciones.

¿Cuál es la mejor manera de manejar esto?

+0

relacionados? http://stackoverflow.com/questions/10429648/backbone-js-how-to-unbind-from-events-on-model-remove/10433015#10433015 – fguillen

+0

¿Está reutilizando un 'el' al cambiar de vista en lugar de creando nuevos? El jQuery 'delegate' está vinculado al' el' de la vista. –

+0

@muistooshort sí, muchas veces reutilizo el mismo contenedor DOM y se lo entrego a la vista, en lugar de crear y adjuntar uno nuevo cada cierto tiempo. Es por eso que la eliminación de las devoluciones de llamada fantasma es de importancia crítica – preslavrachev

Respuesta

5

¿Es una mala práctica llamar al undelegateEvents() en el método remove()?

No es necesario a menos que estés implementar su propio remove() y no llama o Backbone.View.remove()this.$el.remove(). Eso es si estás usando jQuery, al menos. Llamar al remove() en una vista Backbone llamará al jQuery.remove(), que eliminará todos los detectores de eventos DOM de todos modos.

Me di cuenta de que estoy cayendo en tantos problemas vinculantes, simplemente reiniciando una variable de vista.

Mucha gente parece usar Backbone.Events como si fuera una especie de magia que no tienen que limpiar después, por ejemplo:

var View = Backbone.View.extend({ 

    initialize : function (options) { 

    // `on()` or `bind()` 

    this.model.on('something', this.render, this); 

    } 

}); 

Véase mi respuesta en Delegating events to a parent view in Backbone

¿Es posible que los problemas de suceso fantasma que experimenta sean con eventos Backbone y no con eventos DOM?

Si mantiene el objeto modelo pero quiere deshacerse de ese objeto de vista o sus registros de evento Backbone, tiene que hacer view.model.off(null, null, this);. Tienes que desvincular los eventos que has registrado en cualquier objeto externo. Si lo desea, puede anular Backbone.View.remove() y hacerlo allí, pero de manera predeterminada ese método es solo una abreviatura de view.$el.remove().

Cuestiones relacionadas