【发布时间】:2015-01-23 01:04:55
【问题描述】:
我正在使用 Typescript 编写几何引擎,并且正在尝试实现拖放。我有一个从几何对象继承的点对象,它可以控制svg 元素内的circle 元素。我有一个mousedown even 监听器附加到调用属于点对象的函数的圆元素,有点像这样:
class point extends geometry {
htmlNode:any;
constructor() {
this.htmlNode = makeTheThing();
addItToTheDom();
this.htmlNode.addEventListener("mmousedown",this.onClick);
onClick();
}
onClick() {
console.log(this);
}
}
当页面加载时,它会将点对象输出到控制台,但是当我单击它时,它会输出 html 元素,而不是 javascript 对象。以前我是这样解决的:
class point extends geometry {
htmlNode:any;
constructor() {
this.htmlNode = makeTheThing();
addItToTheDom();
var blah = this;
var f = function() {
console.log(blah);
}
this.htmlNode.addEventListener("mmousedown",f);
f();
}
onClick() {
console.log(this);
}
}
那会在加载和单击时给出 javascript 对象,但它很难看,我想做得更干净。
更新:对于任何关心的人,我最终只是重写了这个,现在更漂亮了。
【问题讨论】:
-
试试
this.htmlNode.addEventListener("mmousedown",f.bind(this));。不过,this可能又被分配给了 htmlNode。 -
@Halcyon 这很有效,而且更漂亮,但我也觉得有点老套,我会一直使用它,直到找到更好的东西
-
所以,默认情况下,事件回调中的
this会被设置为处理事件的DOM节点。你必须决定你想要this是什么。如果这是您想要的,那么您可以在分配事件处理程序之前将this保存到范围内的局部变量中,以便您可以通过这种方式访问该值。如果您希望this成为您自己的对象,则使用.bind()自行设置。这是两个主要选项。
标签: javascript typescript