2011-10-10 8 views
7

Tengo una vista.Cómo obtener el elemento que desencadenó el evento mediante el controlador de eventos de backbone

//define View 
var CreatePollView = Backbone.View.extend({ 
    events: { 
     "click #addOption": "addOption", 
     "change .dynamicInput": "changeInputs" 
    }, 
    initialize: function() { 
     _.bindAll(this, "render", "addOption", "changeInputs"); 
     this.model.bind('change', this.render); 
    }, 
    changeInputs: function() { 
     var newVal = $(this).val(); // this throws exception in jquery script 
     this.model.set("Subject", { Subject: newVal }); 
    }, .... 

¿Cómo puedo acceder al elemento (se trata de un elemento de entrada) en cuyo caso el cambio fue provocado?

Respuesta

8

que está recibiendo una excepción porque se está llamando _.bindAll en changeInputs. Cuando haces eso, estás diciendo que changeInputs se vinculará al contexto de tu objeto cuando sea llamado.

En otras palabras, cuando se refiere a $(this) está enviando una instancia de CreatePollView a jQuery, que no le gusta.

desea mantener esta unión, sin embargo, debido a que accede a su modelo (this.model) por lo this tiene que ser la instancia de CreatePollView.

En su lugar, se puede obtener un evento de su función y utilizar el target o alguna otra pieza de información:

changeInputs: function(e) { } 
+0

+1 para la explicación adicional en _.bindAll realmente interesante que a veces todavía lucha con estas ataduras :) – Sander

+2

dentro de su método 'changeInputs', puede obtener el elemento específico que se cambió al llamar a' $ (e.currentTarget) 'o' $ (e.target) 'como sugirió Brian, según sus necesidades. 'e' es un objeto jquery event args, así que lee la documentación de jquery para entender el diff. –

+0

gracias chicos @Sander. Buena explicación. Parece una forma adecuada de hacerlo. Mientras tanto logré ponerlo en funcionamiento, pero realmente no entiendo de dónde viene la colección de argumentos ... vea el código a continuación changeInputs: function() { var newVal = arguments [0] .srcElement. valor; this.model.set ("Asunto", {Asunto: newVal}); }, – Tom

0
changeInputs: function(e){ 
    //use e.target 
    ... 
} 
Cuestiones relacionadas