2014-04-03 31 views
32

HTML:

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

Trong kinh điển jQuery tôi sẽ làm:

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

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

Để có được data-id của phần tử nhấp

Trong nguyên cảo (trong một lớp học) tôi sử dụng:

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

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

.... 
} 

Ở đây tôi không nhận được phần tử được nhấp - $(this) là phiên bản của lớp.

Tôi đã làm gì sai?

+1

Bạn không làm gì sai - đó là TypeScript quá hữu ích. Các phương thức lớp bên trong 'this' được xử lý như thể nó luôn đề cập đến đối tượng tương ứng. Vì vậy, bạn có hai giải pháp - hoặc là nắm bắt phần tử được nhấp với thuộc tính 'event.target' hoặc xác định hàm xử lý bên ngoài lớp đó. – raina77ow

+0

Như tôi có thể thấy hầu hết các câu trả lời là không đầy đủ hoặc sai. vui lòng truy cập câu trả lời của tôi ở đây: http://stackoverflow.com/questions/38159416/using-the-this-in-event-handler-with-typescript/38159643?noredirect=1#comment63747929_38159643 –

Trả lời

36

Theo Typescript's spec "this" là tham chiếu đến cá thể của lớp mà phương thức thuộc về/được gọi.

Bạn có thể sử dụng thuộc tính mục tiêu của đối tượng sự kiện truyền cho callback:

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

Hoặc event.currentTarget tùy thuộc vào nếu bạn muốn để có được những yếu tố thật sự nhấp vào hoặc các yếu tố đó bắt sự kiện này.

+3

tôi sử dụng ** $ ("div ") .on (" click "," button ", (event) => this.test (event)); ** và trong hàm: ** test công khai (phần tử: JQueryEventObject) {$ (element.target) } ** .... nó hoạt động - cảm ơn bạn! – mdunisch

+0

@ user3351722: cảm ơn. Điều này giải quyết vấn đề thực tế khi truy cập cả mục tiêu sự kiện và lớp. – realbart

3

Bằng cách sử dụng các chức năng mũi tên (event) => TypeScript sẽ giúp bạn bị ràng buộc một cách từ từ. (Trong mã biên soạn một trường hợp bị bắt trước đây gọi là _this)

Nếu bạn chuyển sang sử dụng cú pháp chức năng vani bạn sẽ có thể sử dụng $(this) như thường lệ:

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

Rõ ràng bạn có một vấn đề với các trường hợp của phương pháp thử nghiệm được gọi nhưng tôi nghĩ rằng nó đáng để chia sẻ.

+0

Tôi đã phải sử dụng câu trả lời này chứ không phải những câu trả lời được đề xuất vì tôi đã gặp vấn đề tương tự khi cố gắng mở rộng jQuery.fn bằng phương pháp mở rộng của riêng mình, không cung cấp tham chiếu thay thế cho 'this' như các sự kiện. – rushinge

17

Sử dụng event.currentTarget đã làm việc cho tôi khi cố gắng lấy thuộc tính dữ liệu của những gì được nhấp.

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

Điều này làm việc cho tôi! Thumbs up! –

+0

Làm việc cho tôi! Cảm ơn rất nhiều –

Các vấn đề liên quan