2014-04-03 16 views
32

HTML:

<div> 
<button data-id="3">Click Me</button> 
</div> 

W klasycznym jQuery zrobiłbym:

$("div").on("click","button", test); 

function test(){ 
    alert($(this).data("id")); 
} 

Aby uzyskać data-id elementu klikniętego

W maszynopisie (w klasie) Używam:

class foo { ... 
$("div").on("click", "button", (event) => this.test()); 

public test(){ 
    alert($(this).data("id")); // "undefined" 
    console.log($(this)); 
} 

.... 
} 

Tutaj nie dostaję klikniętego elementu - instancja klasy to $(this).

Co zrobiłem źle?

+1

Nie robisz niczego złego - to TypeScript było trochę zbyt pomocne. Metody klasy wewnętrznej "this" traktowane są tak, jakby zawsze odnosiły się do odpowiedniego obiektu. Masz więc dwa rozwiązania - złap kliknięty element za pomocą właściwości 'event.target' lub zdefiniuj funkcję obsługi poza tą klasą. – raina77ow

+0

Jak widać większość odpowiedzi jest niepełnych lub błędnych. odwiedź moją odpowiedź tutaj: http://stackoverflow.com/questions/38159416/using-the-this-in-event-handler-with-typescript/38159643?noredirect=1#comment63747929_38159643 –

Odpowiedz

36

Zgodnie z Typescript's spec "this" odnosi się do instancji klasy, do której należy metoda/jest wywoływana.

Można użyć atrybutu target obiektu zdarzenia przekazany do wywołania zwrotnego:

class foo { 
    public test(evt){ 
    alert($(evt.target).data("id")); // "undefined" 
    console.log($(evt.target)); 
    } 
} 

Albo event.currentTarget zależności od tego czy chcesz uzyskać element kliknęli lub element, który przechwyconego zdarzenia.

+3

Używam ** $ ("div" ") .on (" kliknij "," przycisk ", (zdarzenie) => ten.test (zdarzenie)); ** oraz w funkcji: ** test publiczny (element: JQueryEventObject) {$ (element.target) } ** .... działa - dziękuję! – mdunisch

+0

@ user3351722: thanks. Rozwiązuje to rzeczywisty problem z dostępem zarówno do celu zdarzenia, jak i do klasy. – realbart

3

Za pomocą funkcji strzałek (event) => TypeScript daje ci to leksykalnie. (W kodzie sporządzoną wcześniej ujęte instancja o nazwie _this)

Jeśli przełączyć się na używanie składni funkcji wanilia powinieneś być w stanie korzystać $(this) tak jak zwykle:

$("div").on("click", "button", function(event) { this.test()}); 

Oczywiście masz problem z instancji metody testowej, ale uznałem, że warto ją udostępnić.

+0

Musiałem użyć tej odpowiedzi, a nie sugerowanych, ponieważ miałem ten sam problem, próbując rozszerzyć jQuery.fn o własną metodę rozszerzenia, która nie zapewnia alternatywnego odniesienia do "tego", podobnie jak w przypadku zdarzeń. – rushinge

17

Użycie dla mnie event.currentTarget przydało mi się, gdy próbowałem uzyskać atrybut danych z tego, co zostało kliknięte.

$('.elementID').click(e => this.clickedElement(e)); 


clickedElement(e: JQueryEventObject) { 
    var iWasClickedData = $(this).data('key'); // will not work 
    var iwasClickedDataFixed = $(e.currentTarget).data('key'); // will work 
} 
+0

To działało dla mnie! Kciuki w górę! –

+0

Pracowałem też dla mnie! Wielkie dzięki –