我有一个管理特定对话框的单独对象。考虑以下代码。由于很容易想象函数的作用,因此我无法访问该类的实例。我尝试使用传统的that = this
方法。
export class Whatever implements OnInit {
that = this;
dialog = {
data:{},
open:function() {
//way to access 'that' variable
},
close:function() {},
toggle:function() {}
}
//other declarations and functions
}
在我的应用程序扩展时,该服务中有太多功能。因此,我试图将这些功能中的一些整合到对象中,这将使代码更简洁。
如果有更好的方法,我也想知道。谢谢。
答案 0 :(得分:4)
最好的方法是将function(){}
替换为ES6箭头功能,该功能像this
一样保留() => {}
上下文。
您也可以使用functions(){}.bind(this)
,但是最好只使用箭头功能。两者都将保留您在函数正文中对this
的引用
答案 1 :(得分:1)
您必须使用箭头功能以确保不会丢失上下文(this
);
export class Whatever implements OnInit {
dialog = {
data:{},
open:() => {
//'this' will point to Whatever class's instance
},
close:() => {},
toggle:() => {}
}
//other declarations and functions
}
答案 2 :(得分:0)
在您的代码中,that
不是变量,它是Whatever
实例的属性。
您的dialog
也是Whatever
实例的属性。在调用其方法时,this
会因调用方式而异。
要确保他们访问Whatever
实例,可以使用箭头功能,并在功能内使用this
:
export class Whatever implements OnInit {
dialog = {
data: {},
open: () => {
// use `this` here
// use `this.dialog.data` to acccess the data above
},
close: () => {},
toggle: () => {}
};
//other declarations and functions
}
之所以行之有效,是因为在您声明了类字段的情况下,它们被有效地初始化,就好像它们在构造函数内部一样,并且在构造函数内部,this
引用了实例。箭头函数在创建它们的上下文的this
上封闭(就像在范围内变量上封闭一样)。