Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在事件处理程序中使用另一个类的方法并绑定当前类上下文时出现typescript错误TS2339_Javascript_Angular_Typescript_Ecmascript 6 - Fatal编程技术网

Javascript 在事件处理程序中使用另一个类的方法并绑定当前类上下文时出现typescript错误TS2339

Javascript 在事件处理程序中使用另一个类的方法并绑定当前类上下文时出现typescript错误TS2339,javascript,angular,typescript,ecmascript-6,Javascript,Angular,Typescript,Ecmascript 6,我有一个名为DomService 我有另一个服务处理模式功能,名为ModalService 在ModalService中,我绑定了一些事件,并将DomService中的方法作为侦听器提供给它,如下所示: document.body.addEventListener('focus',this.domService.keyPress.bind(this),true) 然后按键看起来像: keyPress(event){ if (event.which === key.escape) {

我有一个名为
DomService

我有另一个服务处理模式功能,名为
ModalService

ModalService
中,我绑定了一些事件,并将
DomService
中的方法作为侦听器提供给它,如下所示:

document.body.addEventListener('focus',this.domService.keyPress.bind(this),true)

然后按键看起来像:

keyPress(event){
    if (event.which === key.escape) {
        event.preventDefault();
        this.hide();
    }
}
它工作得很好,问题是typescript在实际绑定到
ModalService
类时,仍然将
this
视为对
DomService
类的引用,因此它告诉我类型
DomService
上不存在
hide
属性


我能做些什么让typescript冷静下来吗?

试着把你的函数改成箭头函数

改变

keyPress(event) {


您可以阅读typescript中的箭头函数

尝试将函数更改为箭头函数

改变

keyPress(event) {


您可以阅读typescript中的箭头函数

您可以通过将它(及其类型)作为第一个参数添加到函数中来更改任何函数中该
的上下文。因此,要将
内的
的上下文更改为
ModalService
,您可以执行以下操作:

keyPress(this: ModalService, event) {
    if (event.which === key.escape) {
        event.preventDefault();
        this.hide(); // Now is OK.
    }
}
您可以阅读有关该功能的更多信息


除此之外,如果上述解决方案不充分,您始终可以在任何创建错误的行上方添加一行
/@ts ignore
,以使其静音。

您可以在任何函数中通过将其(及其类型)添加为函数的第一个参数来更改此
的上下文。因此,要将
内的
的上下文更改为
ModalService
,您可以执行以下操作:

keyPress(this: ModalService, event) {
    if (event.which === key.escape) {
        event.preventDefault();
        this.hide(); // Now is OK.
    }
}
您可以阅读有关该功能的更多信息

除此之外,如果上述解决方案不足,您可以始终在任何创建错误的行上方添加一行
/@ts ignore
,以使其静音。

您可以使用并处理(订阅)“发出”事件

ModalService

this.subscriptionHide = this.domService.getHideEmitter()
  .subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();

keyPress(event){
    if (event.which === key.escape) {
        event.preventDefault();
        this.hideEmitter.emit(null);
    }
}

getHideEmitter() {
    return this.hideEmitter;
}
DomService

this.subscriptionHide = this.domService.getHideEmitter()
  .subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();

keyPress(event){
    if (event.which === key.escape) {
        event.preventDefault();
        this.hideEmitter.emit(null);
    }
}

getHideEmitter() {
    return this.hideEmitter;
}
hideEmitter:EventEmitter=neweventemitter();
按键(事件){
if(event.which==key.escape){
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter(){
返回此.hideEmitter;
}
您可以使用和处理(订阅)“发出”事件

ModalService

this.subscriptionHide = this.domService.getHideEmitter()
  .subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();

keyPress(event){
    if (event.which === key.escape) {
        event.preventDefault();
        this.hideEmitter.emit(null);
    }
}

getHideEmitter() {
    return this.hideEmitter;
}
DomService

this.subscriptionHide = this.domService.getHideEmitter()
  .subscribe(() => this.hide());
hideEmitter: EventEmitter<any> = new EventEmitter();

keyPress(event){
    if (event.which === key.escape) {
        event.preventDefault();
        this.hideEmitter.emit(null);
    }
}

getHideEmitter() {
    return this.hideEmitter;
}
hideEmitter:EventEmitter=neweventemitter();
按键(事件){
if(event.which==key.escape){
event.preventDefault();
this.hideEmitter.emit(null);
}
}
getHideEmitter(){
返回此.hideEmitter;
}

哪个
被视为
DomService
按键中的那一个
还是
addEventListener中的那一个
?编辑:没关系,我明白你的意思。此外,如果您所寻找的只是一种消除typescript错误的方法,那么总是会有值得信赖的
/@ts ignore
注释。我们可以停在
行,我有一个服务可以处理我所有的dom操作。不要这样做,我们应该避免在Angular中直接进行DOM操作。此外,如果您知道
this
始终是对
ModalService
的引用,您可以将签名更改为:
keyPress(this:ModalService,event){…}
(请注意,使用
作为第一个参数仅用作类型注释,它不会在输出中显示为参数)@Alex我不认为我需要添加太多细节,但DomService主要通过resolveComponentFactory创建动态元素。你可以在这里阅读更多信息:@Kolby当然,我现在明白了。我立即根据那条评论得出结论:p这
被视为
DomService
内部
按键
addEventListener
中的一个?编辑:无所谓我明白你的意思。此外,如果你想要的只是一种消除类型脚本错误的方法,那么总是有可靠的
/@ts ignore
注释。我们可以停在
行。我有一个服务可以处理我所有的dom操作
。不要t、 我们应该避免在Angular中直接进行DOM操作。此外,如果您知道
this
始终是对
ModalService
的引用,您可以将签名更改为:
keyPress(this:ModalService,event){…}
(请注意,使用
作为第一个参数仅用作类型注释,它不会在输出中显示为参数)@Alex我不认为我需要添加太多细节,但DomService主要通过resolveComponentFactory创建动态元素。你可以在这里阅读更多信息:@Kolby当然,我现在明白了。我立即得出结论,仅仅基于这一评论:PI希望它具有ModalService的上下文。它有一个
hide
我需要调用的方法。不过我希望它具有ModalService的上下文。它有一个我需要调用的
hide
方法。