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

¿Fue útil?

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/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top