2016-08-30 47 views
0

我有一個產品服務,其方法從json數據返回一個Observable。Rx訂閱OnComplete引發火災,但無法使用數據

product.service.ts ....

getProducts(): Observable<IProductData[]> { 
    return this._http.get(this._productUrl) 
     .map((response: Response) => <IProductData[]> response.json()) 
     .catch(this.handleError); 
} 

以我分量I訂閱中的service並調用的getProducts()方法返回的可觀測IProductData []。

mycomponent.ts ..

productData: IProductData[]; 

ngOnInit(): void { 

    this._productService.getProductsObservable() 
     .subscribe(
       productData => this.productData = <IProductData[]>productData, 
       error => this.errorMessage = <any>error, 
       function() { console.log(this.productData) } 
     ); 
} 

當我回顧onCompleted的console.log this.productData是不確定的!

我想使用此數據來設置我的組件中的字段。何時/如何確定數據已被返回?

如果我輸出this.productData上的按鈕單擊事件數據已填充,但我想在init上這樣做。

任何建議或意見將不勝感激。

歡呼

回答

0

你是不是在最後的塊用箭頭功能,使您的this是本地的,你在通過complete功能。

除了外觀有() => {}之間實際的語義差別function() {}

這裏閱讀:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

...直到箭頭函數,每個新函數都定義了它自己的這個值(一個構造函數中的新對象,嚴格模式函數調用中未定義的對象,如果該函數被稱爲「對象方法」等的上下文對象)。 )。事實證明,這是一種面向對象的編程風格。

在ECMAScript 3/5中,通過將此值賦給一個可以關閉的變量來解決此問題。

箭頭函數不會創建它自己的上下文;相反,它捕獲了封閉環境的這個值...

+0

謝謝保羅就是這樣!我現在對箭頭函數在JavaScript中的工作方式有了更清晰的瞭解:) – Ianbara