2016-05-13 8 views
6

2番の角度で新しいhttpサービスを使用すると、コンソールにエラーを投げるだけでなく、私のエラーでさらにやりたいと思います。残念ながら、キャッチコールバック関数内からオブジェクトプロパティにアクセスできないようです。Angular 2のオブジェクトプロパティにアクセスする方法(this)

マイHTTPサービスの呼び出し:

return this.http.get(this.apiUrl, options) 
      .map(this.extractData, this) 
      .catch(this.handleError) 

マイhandleErrorのコールバックは、fn:

handleError (error) { 
    console.log(this)//undefined! 
    if(error.status === 401){ 
    this.router.navigate(['/login'])//because `this` is undefined, this does not work 
    } 
    ... 
} 

rxjsのドキュメントによると、漁獲量は、マップに非常に有用である二thisArg引数をサポートしていません。機能:

extractData(res) { 
    console.log(this)//returns the instance of my service class, which is what I want 
    this.someFunctionInMyService()//works great! In fact, I could call this.router.navigate if I wanted. 
    return res.json() 
} 

私のサービスのプロパティを呼び出すにはhandleErrorコールバック内から

答えて

8

問題は、実行時にコンテキスト(this)を失うように関数を直接参照することです。このことから防止するために

、あなたはあなたの方法ラップする必要があります。

return this.http.get(this.apiUrl, options) 
     .map(this.extractData, this) 
     .catch(err => { 
      this.handleError(err); 
     }) 

またはbind方法活用:

return this.http.get(this.apiUrl, options) 
     .map(this.extractData, this) 
     .catch(this.handleError.bind(this) 

をしかし、あなたが失うので、欠点は、活字体と第二のアプローチを使用することがありますタイプ。

+1

恐ろしい:

は、このリンクを参照してください!関数のコンテキストの私の理解の欠如。 ...また、私は前に関数でラップしようとしましたが、矢印関数ではなく、私は矢印関数の本当の目的を忘れていました。ありがとう! – Joao

+1

ありがとう!完璧に働いた。 – michali

関連する問題