2011-10-10 6 views
7

Ho una vista.Come ottenere l'elemento che ha attivato l'evento tramite il gestore di eventi di 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 }); 
    }, .... 

Come accedere all'elemento (è un elemento di input) su cui è stato attivato l'evento di modifica?

risposta

8

hai trovato un'eccezione perché si sta chiamando _.bindAll su changeInputs. Quando lo fai, stai dicendo che lo changeInputs sarà legato al contesto del tuo oggetto ogni volta che viene chiamato.

In altre parole, quando si fa riferimento a $(this) si invia un'istanza di CreatePollView in jQuery, che non è gradita.

Se si desidera mantenere questa associazione, tuttavia, poiché si sta accedendo al modello (this.model), this deve essere l'istanza di CreatePollView.

Invece, è possibile ottenere un evento dalla vostra funzione e utilizzare il target o qualche altro pezzo di informazione:

changeInputs: function(e) { } 
+0

+1 per la spiegazione aggiunto _.bindAll veramente interessante che a volte ancora lottare con queste lega :) – Sander

+2

all'interno del tuo metodo 'changeInputs', puoi ottenere l'elemento specifico che è stato cambiato chiamando' $ (e.currentTarget) 'o' $ (e.target) 'come suggerito da Brian, a seconda delle tue esigenze. 'e' è un oggetto args evento jquery, quindi leggi sulla documentazione di jquery per capire il diff. –

+0

grazie ragazzi @Sandro. Buona spiegazione Sembra un modo corretto per farlo. Nel frattempo sono riuscito a farlo funzionare, ma non capisco da dove viene la collezione di argomenti .... vedi il codice sottostante changeInputs: function() { var newVal = arguments [0] .srcElement. valore; this.model.set ("Subject", {Subject: newVal}); }, – Tom

0
changeInputs: function(e){ 
    //use e.target 
    ... 
} 
Problemi correlati