¿Por qué los eventos no disparan después del segundo renderizado en Backbone.js?
-
25-10-2019 - |
Pregunta
Estoy creando una aplicación en Backbone.js que tiene vistas de padres y múltiples hijos. Las vistas del niño contienen enlaces que escuchan y realizan una función.
El padre almacena una lista de todas las opiniones de los niños. En la función Render, después de que se termina de calcular su propio HTML, hace lo siguiente:
$(this.el).html(html);
for (var i = 0; i < this.views.length; i++){
$('.children', this.el).append(this.views[i].render().el);
}
Respuesta: El problema era que estaba creando el enlace durante el render. Es decir, en el primer render (que se llamó desde el init) el evento se unió con éxito al enlace. Sin embargo, dado que todas las siguientes llamadas de Render recrean todo el elemento, el nuevo enlace no tenía el controlador vinculado. Esto se resolvió a través de @Tom TU Solución de agregar this.delegateEvents()
al render
Solución
Probablemente estés usando jQuery remove
Funcionar en algún lugar para eliminar las subvistas de la vista: elimina automáticamente todos los eventos vinculados al elemento (this.el) - establecido en el events
objeto. Puedes usar this.delegateEvents()
Método en renderizado de las subvistas después de renderizar la plantilla para reembolsar los delegados del evento establecido en events
objeto o use jQuery detach
En su lugar, el método eliminar los elementos de DOM sin eliminar los enlaces de eventos (Enlace). los delegateEvents
El método es bastante costoso y, por lo tanto, recomendaría el detach
Método para eliminar elementos que desea reutilizar si está presentando largas listas de subvistas, irrelevantes si se trata solo de un par de vistas.
Otra posibilidad es que hayas establecido el events
Objeto incorrecto: difícil de saber de la cantidad de código proporcionado, pero apuesto a la primera.
Otros consejos
Un desafío realmente común. Para los futuros buscadores de esta pregunta, aquí hay un gran artículo sobre la renderización de la vista:
Solo debe asegurarse de que DelegateEvents esté llamado para volver a revisar los eventos en sus subvistas en cualquier momento .html () se ejecuta. Y dado que SetLement de Backbone ya llama a DelegateEvents, una solución rápida podría verse así ...
http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/