2011-11-29 20 views
12

Estoy creando una aplicación en Backbone.js que tiene una vista principal y varias vistas secundarias. Las vistas secundarias contienen enlaces que escuchan y realizan una función.¿Por qué los eventos no se activan después de la segunda representación en Backbone.js?

El elemento primario almacena una lista de todas las vistas secundarias. En la función de hacer que, después de que se hace calculando su propio código HTML, se 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 yo estaba creando el enlace durante el render. Es decir. en la primera representación (que se llamó desde el init), el evento se enlazó con éxito al enlace. Sin embargo, dado que todas las siguientes llamadas de renderizado recrean el elemento completo, el nuevo enlace no tenía el controlador asociado. Esto se resolvió a través de la solución @ Tom Tu de la adición a la this.delegateEvents() rendir

Respuesta

13

Usted probablemente se está utilizando la función jQuery remove alguna parte para eliminar los subvistas desde el punto de vista - que elimina automáticamente todos los eventos ligados al elemento (this.el) - establecido en el objeto events. Puede utilizar el método this.delegateEvents() en el procesamiento de las subvistas después de representar la plantilla para volver a vincular los delegados de evento establecidos en el objeto events o usar el método jquery detach para eliminar elementos del DOM sin eliminar los enlaces de eventos (link). El método delegateEvents es bastante costoso y, por lo tanto, recomendaría el método detach para eliminar elementos que desea volver a utilizar si está procesando largas listas de subvistas, lo cual es irrelevante si solo se trata de un par de vistas.

Otra posibilidad es que haya configurado el objeto events incorrecto, difícil de decir por la cantidad de código proporcionado, pero apuesto por el primero.

+0

añade un poco más detalles, espero que ayude –

+0

que es una muy buena idea, pero agregó el remove codigo arriba. Además, los eventos no se pueden establecer mal, o no se dispararía en primer lugar. – chacham15

7

Un desafío muy común. Para los futuros buscadores de esta pregunta, aquí hay un gran artículo sobre la representación de vista:

Sólo tiene que asegurarse de que delegateEvents se llama volver a enlazar los eventos en sus subvistas cualquier momento .html() se ejecuta. Y puesto que setElement de Backbone llama delegateEvents ya, una solución rápida podría tener este aspecto ...

http://ianstormtaylor.com/rendering-views-in-backbonejs-isnt-always-simple/

+0

Eso es exactamente lo que estaba buscando. ¡Gracias! –

Cuestiones relacionadas