2014-04-03 11 views
32

HTML:

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

Nel classico jQuery vorrei fare:

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

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

Per ottenere l'data-id dell'elemento cliccato

a macchina (in una classe) Io uso:

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

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

.... 
} 

Qui non viene visualizzato l'elemento su cui si fa clic: $(this) è l'istanza della classe.

Cosa ho fatto di sbagliato?

+1

Non si fa niente di sbagliato, è un po 'troppo utile per TypeScript. I metodi di classe interna "questo" vengono trattati come se si riferissero sempre all'oggetto corrispondente. Quindi avete due soluzioni: prendere l'elemento cliccato con la proprietà 'event.target' o definire la funzione di gestore al di fuori di quella classe. – raina77ow

+0

Come posso vedere la maggior parte delle risposte sono incomplete o errate. per favore visita la mia risposta qui: http://stackoverflow.com/questions/38159416/using-the-this-in-event-handler-with-typescript/38159643?noredirect=1#comment63747929_38159643 –

risposta

36

Secondo Typescript's spec "questo" si riferisce all'istanza di classe a cui appartiene il metodo /.

è possibile utilizzare l'attributo target dell'oggetto evento passato al callback:

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

O event.currentTarget a seconda se si desidera ottenere l'elemento effettivamente cliccato su o l'elemento che ha catturato l'evento.

+3

io uso ** $ ("div ") .on (" clic "," pulsante ", (evento) => this.test (evento)); ** e nella funzione: ** test pubblico (elemento: JQueryEventObject) {$ (element.target) } ** .... funziona - grazie! – mdunisch

+0

@ user3351722: grazie. Questo risolve il problema reale dell'accesso sia al target dell'evento che alla classe. – realbart

3

Utilizzando le funzioni di freccia (event) => TypeScript è possibile assegnarlo in modo lessicale. (In codice compilato un'istanza acquisita in precedenza chiamato _this)

Se si decide di utilizzare sintassi funzione vaniglia si dovrebbe essere in grado di utilizzare $(this) come si farebbe normalmente:

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

Ovviamente si ha un problema con l'istanza del metodo di prova chiamato ma ho pensato che valesse la pena condividerlo.

+0

Ho dovuto usare questa risposta piuttosto che quelle suggerite perché avevo lo stesso problema nel tentativo di estendere jQuery.fn con il mio metodo di estensione, che non fornisce un riferimento alternativo a "questo" come fanno gli eventi. – rushinge

17

L'utilizzo di event.currentTarget ha funzionato per me durante il tentativo di ottenere un attributo di dati di ciò che è stato fatto clic.

$('.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

Questo ha funzionato per me! Pollice su! –

+0

Ha funzionato anche per me! molte grazie –