2016-01-07 47 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