2011-11-21 12 views
10

Tengo una vista que tiene una vista dentro de ella (la misma vista, de hecho, es recursiva). Solo quiero que la vista interna maneje el evento desde un evento 'a' onclick. Intenté hacer esto especificando solo los niños directos en el selector, pero no funciona.¿Cómo especifico los elementos secundarios solo en el controlador de eventos Backbone.js?

iv intentado:

 
events: { 
    'click >a': 'toggle' 
}, 

y

 
events: { 
    'click > a': 'toggle' 
}, 

pero no trabajan, alguna sugerencia? (Nota: hacer cosas como usar etiquetas y clases no funcionará porque la vista es recursiva (lo que significa que tanto el interior como el exterior tienen las mismas definiciones de evento)

+0

Podría mostrar su visión completa y cómo se está instanciándola ? En Backbone, los selectores de jQuery tienen un alcance automático para el elemento de vista, debería funcionar en teoría. –

Respuesta

9

se han topado con el mismo problema, y ​​he resuelto por detener la propagación del evento en vista de mi hijo. Por ejemplo ...

events: { 
    'click a': 'toggle' 
}, 

toggle: function (e) { 

    // Stop event here. 
    e.stopImmediatePropagation(); 

    // Do more stuff... 

} 

Esto no responde a su pregunta de cómo especificar selectores secundarios específicos, pero evita que el evento se propague a otros controladores.

0

Puede que tenga que especificar el selector de inicio ... lo que significa que soy no estoy seguro se supone que el selector de base.

events: { 
    'click #parent > a': 'toggle' 
} 

no he probado esto, pero puede funcionar.

+0

no, el padre también recibe el evento – chacham15

+0

que es bueno saber, me imagino que esto probablemente esté relacionado con su análisis sintáctico de los eventos. – Seth

+0

ohh, ¿podría ser que el evento se genere en la vista secundaria, pero se pase al padre? ¿Cómo puedo filtrar esto? – chacham15

1

e.stopImmediatePropagation() es útil si no tiene otros eventos activados cuando hace clic en ese elemento específico. Lo que debe hacer de lo contrario es comparar el e.currentTarget con el elemento que desea seleccionar. Es decir.

events: { 
    'click a': 'toggle' 
} 

toggle: function(e) { 
    if (e.currentTarget == this.$el.find('a')[0]) { 
     ... 
    } 
} 

esta manera, si se tiene una vista padre también disparar un evento cuando se hace clic en ese enlace, que no se detendrá por e.stopImmediatePropagation();

Cuestiones relacionadas