【发布时间】:2018-09-05 11:28:44
【问题描述】:
我有一个简单的 TypeScript 类,它有一个私有函数,当用户单击一个按钮时应该调用它。点击事件通过构造函数中的jQueryclick()事件绑定
HTML
<div id="foobar">
<h2>Foo</h2>
<button type="button">Bar</button>
</div>
TS
$(() => {
var foo = new Bar($("#foobar"));
})
class Bar {
private view: JQuery;
private button: JQuery;
constructor(view: JQuery) {
// Fields
this.view = view;
this.button = view.find("button");
// Events
this.button.click(() => { this.buttonClick() });
}
private buttonClick() {
this.view.find("h2").css("background-color", "red");
}
}
https://jsfiddle.net/z4vo5u5d/18781/
但是不知何故,在执行脚本时,控制台抱怨buttonClick 不是一个函数。我在这里错过了什么?
我想这是"this" in TypeScript 的问题。但我不知道为什么。
已编辑: 正如@Amadan 提到的:
this.button.click(() => { this.buttonClick() });
this.button.click(function () { this.buttonClick(); });
同时,typescriptlang.org/play 上的编译器将其正确翻译为:
var _this = this;
...
this.button.click(function () { _this.buttonClick(); });
【问题讨论】:
-
我不知道,它看起来像一个错误。我在 typescriptlang.org/play 编译了您的课程,然后将 JavaScript 版本粘贴到您的 TypeScript 课程上,它按预期工作。不知道发生了什么。
-
@Amadan TS 不会将箭头函数转译到其中,TS 会正确转译它。无论 jsfiddle 使用什么产生错误的输出,它都不是 TS 编译器。
-
@zerkms:我认为我们实际上是同意的,只是在不同意的情况下。 TS 无法正确或错误地转换,它是一种语言。 JSFiddle 使用的 TS transpiler 不兼容。在 Node 中使用的 TS 转译器,或者在操场上使用的 TS 转译器,可以正确执行。你不能说它不是一个 TS 转译器,正如你不能说一个有虫的苹果不是一个苹果。
-
对,我的意思可能是——这不是 tsc 或 TS 语言问题,而是 jsfiddle 问题,应该在那里报告。
标签: typescript