2016-08-22 8 views
5

starałem się zmienić moje dane przed wpuszczeniem go w metodzie zwanej przez operatora mapy i okazało się, że cała moja druga zmienna poza tą metodą są undefinedzauważalnych zmian zakresu w sposób nazywany przez operatora mapy

Pisałem prosty kod tutaj do reprezentowania, co mam na myśli, zmienna testu rejestrowane są zwracane jako undefined:

import {Observable} from "rxjs/Observable"; 
import {Injectable} from "@angular/core"; 
import {Http, Response} from "@angular/http"; 

@Injectable() 
export class DataService { 
    private API_URL= 'url...'; 

    private test = 1; 

    constructor(private http: Http) {} 

    getData(): Observable<any> { 
     return this.http.get(this.API_URL) 
      .map(this.extractData) 
      .catch(this.handleError); 
    } 

    private extractData(res: Response) { 
     let body = res.json(); 

     console.log(test); 

     return body.data || {}; 
    } 
} 

chciałem wiedzieć, dlaczego tak się dzieje i czy to nie jest sposób na zmianę danych pobranych w jaki sposób mogę to zrobić w usłudze (nie w składniku subskrybenta, ponieważ chcę zmienić dane na podstawie innej zmiennej, która nie ma nic wspólnego ze składnikiem abonenckiej)

+1

Typo? Czy jest to metoda o nazwie "extractSemanticData" lub "extractData"? – cartant

+0

tak, typo i skopiować wklejone. będę edytować. dzięki – Nima

Odpowiedz

5

To JS "cecha" ;-)

Trzeba użyć .bind(this)

return this.http.get(this.API_URL) 
     .map(this.extractData.bind(this)) 
     .catch(this.handleError.bind(this)); 

lub strzałek funkcji

return this.http.get(this.API_URL) 
     .map(val => this.extractData(val)) 
     .catch(err => this.handleError(err)); 

aby zachować zakres this

+1

Działa, dziękuję @ Günter Zöchbauer !. Spędziłem kilka godzin próbując rozwiązać ten problem. Myślałem nawet, że to się dzieje z powodu leniwego ładowania. Ale tak nie było. –