2016-01-07 48 views
13

我正在嘗試Angular2。創建可觀察<T>從結果

我注意到,HTTP服務使用Obserable對象,而不是承諾(我不喜歡太多,選擇.. ASYC /的await正在到達)

在我的服務我從web服務下載廠家的名單。點擊工廠,我使用路由顯示細節。 但是這樣當我回去時,植物又被下載(因爲再次調用構造函數)。

爲了避免這一點,我想要做的事,如:

public getPlants():Observable<Plants[]> 
{ 
    if (this._plants != null) 
     return Observable.fromResult (this._plants); //This method does not exists 

    return this._http.get('../../res/heroes.json')... 
} 

有沒有辦法做到這一點? 如何在我的ts文件中導入Observable類?

謝謝!

+0

如果你只是想angular2,我建議你給[奧裏利亞(http://aurelia.io/docs.html#/aurelia/framework/1.0.0 -beta.1.0.7/doc/article/getting-started)試試? ctrl-f爲「httpclient」來看一個例子。它會像你想要的那樣返回一個Promise。 – MikeSW

+0

不應該是'Observable.just'嗎? (這是它被稱爲其他語言) – njzk2

回答

16

這是我工作的解決方案:

if (this._heroes != null && this._heroes !== undefined) { 
    return Observable.create(observer => { 
     observer.next(this._heroes); 
     observer.complete(); 
    }); 
} 

我希望這是最好的解決辦法。

+0

這是完美的。這節省了我很多時間;謝謝! – b264

+0

好一個人;) –

+0

什麼是變量/參數'observer'的類型? –

12

TypeScript中的方法(或針對該問題的JavaScript)被稱爲of。如果您使用像webpack這樣的模塊捆綁器,則還需要導入運營商;在評論中聲稱SergioL。

例子:

import { Observable } from "rxjs/Observable"; 
import 'rxjs/add/observable/of'; 

public getPlants(): Observable<Plants[]> { 
    // this can be changed to a member variable of course 
    let mocked: Plants[] = [{ 
     id: 1, 
     image: "hello.png" 
    }]; 
    // returns an Observable that emits one value, mocked; which in this case is an array, 
    // and then a complete notification 
    // You can easily just add more arguments to emit a list of values instead 
    return Observable.of(mocked); 
} 
+2

我發現我需要添加'import'rxjs/add/observable/of';'。 – SergioL

+2

如果您不想逐個添加所有操作符,您也可以從'rxjs/Rx''導入。 – LoganMzz