(bu)

2016-05-13 14 views
6

açısal 2'de yeni http hizmetini kullanma ile Açısal 2 http rxjs yakalamak fonksiyonunda nesne özelliklerini nasıl erişilir, sadece konsolda hatalarına yol açan daha benim hataları ile daha fazlasını istiyorum. Ne yazık ki, yakalama geri çağırma işlevinden nesne özelliklerine erişemiyorum.(bu)

Benim http servis çağrı:

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

Benim HandleError geri arama fn:

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

rxjs Docs göre yakalamak haritasında çok faydalıdır ikinci thisArg argüman, desteklemez işlevi:

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() 
} 

Hizmetimi bir özelliği nasıl arayabilirim veya kullanabilirim handleError geri arama içinde?

cevap

8

Senin sorunun, yürütme onun bağlam (this) kaybetmek böylece directily bir işlev başvuru olmasıdır.

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

veya bind yöntemi kaldıraç:

bundan önlemek için

, kendi yöntemini sarmak gerekir

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

Ama kaybetmek beri typescript ile ikinci bir yaklaşım kullanmak için dezavantajları vardır türleri.

+1

Müthiş:

bu bağlantıya bakın! Fonksiyon bağlamını anlamamı. ... ayrıca, daha önce bir işlevde sarmalamayı denedim, ancak bir ok işlevini değil, ok işlevlerinin gerçek amacını unutmuştum. Teşekkürler! – Joao

+1

Teşekkürler! mükemmel çalıştı. – michali