我的服务包含以下代码:
....
isAuthenticated(){
var tt = this;
if(tt.current_user){
return Promise.resolve(tt.current_user,false);
}else{
return new Promise(resolve => {
this.http.get(this.api.urlBase+this.api.apiBase+'/Individuals/me',
{withCredentials: true})
.map(res=>res.json())
.subscribe((data) => {
tt.current_user = data;
resolve(data,false);
},(err)=>{
reject(err,true);
});
})
}
}
....
在我的网页课程中,我试图以下列方式访问它:
constructor(){
...
let tt = this;
individual.isAuthenticated().then(this.handleLogin);
...
}
...
handleLogin(d,err){
console.log("This: ",this);
console.log("This: ",tt);
this.nav.present(this.loading);
}
但在handleLogin
中,this.nav
会引发错误this
未定义,控制台日志显示this
为空,tt
为未定义。如何从该函数中引用this
?
答案 0 :(得分:2)
您需要包装方法调用或在其上调用bind
方法
constructor() {
...
let tt = this;
individual.isAuthenticated().then((data) => { // <----
this.handleLogin(data)
});
...
}
...
handleLogin(d,err){
console.log("This: ",this);
console.log("This: ",tt);
this.nav.present(this.loading);
}
或
constructor() {
...
let tt = this;
individual.isAuthenticated().then(this.handleLogin.bind(this));
...
}
...
handleLogin(d,err){
console.log("This: ",this);
console.log("This: ",tt);
this.nav.present(this.loading);
}
在TypeScript中使用bind
方法有一个缺点,因为您丢失了原始函数签名的类型安全性。有关详细信息,请参阅此链接:
答案 1 :(得分:0)
将handleLogin
定义为属性而非方法
//handleLogin(d,err){
handleLogin = (d,err) => {
console.log("This: ",this);
console.log("This: ",tt);
this.nav.present(this.loading);
}
这将使this
按预期工作