2011-10-10 10 views
7

Mam widok.Jak uzyskać element, który wywołał zdarzenie za pośrednictwem modułu obsługi zdarzeń szkieletu

//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 }); 
    }, .... 

Jak uzyskać dostęp do elementu (jest to element wejściowy), w którym wywołano zdarzenie zmiany?

Odpowiedz

8

Otrzymujesz wyjątek ponieważ dzwonisz _.bindAll na changeInputs. Kiedy to zrobisz, mówisz, że changeInputs będzie związany z kontekstem twojego obiektu, gdy zostanie wywołany.

Jeśli chodzi o $(this), wysyłasz instancję CreatePollView do jQuery, której nie lubi.

Chcesz zachować to powiązanie, ponieważ uzyskujesz dostęp do swojego modelu (this.model), więcmusi być instancją CreatePollView.

Zamiast tego, można uzyskać zdarzenie ze swojej funkcji i użyć target lub jakaś inna informacja:

changeInputs: function(e) { } 
+0

+1 dla dodanego wyjaśnienie _.bindAll naprawdę interesujące i czasami nadal borykają się z tych powiązań :) – Sander

+2

Wewnątrz metody 'changeInputs' możesz uzyskać specyficzny element, który został zmieniony przez wywołanie' $ (e.currentTarget) 'lub' $ (e.target) 'jak sugerował Brian, w zależności od twoich potrzeb. 'e' jest obiektem argines zdarzenia jquery, więc przeczytaj dokumentację jquery, aby zrozumieć różnicę. –

+0

dzięki chłopaki @Sander. Dobre wytłumaczenie. Wydaje się, że to właściwy sposób. W międzyczasie udało mi się go uruchomić, ale tak naprawdę nie rozumiem skąd pochodzi zbiór argumentów ... zobacz poniższy kod: changeInputs: function() { var newVal = arguments [0] .srcElement. wartość; this.model.set ("Subject", {Subject: newVal}); }, – Tom

0
changeInputs: function(e){ 
    //use e.target 
    ... 
} 
Powiązane problemy