Angular 2`the`引用承诺

时间:2016-05-17 16:11:11

标签: typescript angular

我的服务包含以下代码:

....
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

2 个答案:

答案 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按预期工作