2012-02-21 13 views
14

Si almaceno vista en window.myView variables, hacen que, a continuación, llamar a la consola en javascript:¿Por qué los eventos de Backbone al reemplazar html no funcionan?

$('#container').html('') 

y luego llamar a:

$('#container').html(window.myView.$el) 

eventos Bound dejarán de funcionar.

estoy bastante seguro de que se supone que es así, pero:

  • exactamente por qué funciona de esta manera?
  • cómo volver a renderizar una subparte de vista sin perder enlaces de eventos?
  • ¿Por qué llamar a myView.render() no perderá enlaces de eventos?

Actualización:

encontrados this artículo. ¿Esa es la razón?

Asegúrese de que jQuery no está descargando sus eventos cuando no se quiere que

Si usted está construyendo una aplicación donde se crean los puntos de vista sobre la marcha y adjuntar/elimine a la que dom, puede tener un problema Cada vez que eliminas una vista del dom, jQuery descarga todos los eventos. Por lo tanto, no puede tener una referencia a una vista y eliminarla del dom y luego volver a adjuntarla más tarde. Todos sus eventos habrían sido descargados. Si desea mantener las vistas, una mejor idea es ocultarlas mediante la pantalla: ninguna. Sin embargo, no debe abusar de esto y reciclar vistas que no va a usar por un tiempo (y evitar pérdidas de memoria).

+0

Gracias por esta pregunta. Tuve un problema similar con Spine y no pude entender qué estaba pasando. –

Respuesta

18

jQuery empty, html y remove eventos son la limpieza de todos los enlaces de evento jQuery y datos para evitar pérdidas de memoria (se puede comprobar el código fuente de jQuery para cleanData método para averiguar más - que es un método no documentado)

view.render() no elimina los eventos porque los eventos de vista de red troncal están vinculados mediante la delegación de eventos y están vinculados a la vista el en lugar de directamente a los elementos en la vista.

Si desea reutilizar sus vistas, puede eliminarlas utilizando el método jQuery detach que mantiene todos los eventos y datos vinculados, aunque debe tener cuidado de no producir pérdidas de memoria de esta manera. (jquery detach docs)

Si quiere ir de la primera manera siempre puede volver a vincular los eventos Backbone fácilmente con el método Backbone.View delegateEvents. (backbone doc)

ps. también es más limpio y más óptimo usar jQuery .empty() en lugar de .html('') ya que el método jQuery html siempre llama primero a los vacíos para limpiar todos los eventos y datos antes de insertar nuevos html. Además, nunca mezcle jquery y DOM internoHTML, ya que podría producir pérdidas de memoria debido a eventos/datos no actualizados jQuery

+1

llamando a 'esto.delegateEvents() 'en la vista funcionó como un amuleto. Gracias. –

+0

¡Hooray para .delegateEvents! – SimplGy

+0

Considere también desmontar y volver a crear todas las subvistas cuando represente la vista principal. –

Cuestiones relacionadas