2017-01-25 114 views
2

我对Angular 2服务中Obserbles和变量的使用有疑问。前者似乎是首选的方式,但我无法找出原因。Observable与Angular 2服务中的变量

给定一个示例服务如此:

@Injectable() 
export class TestService { 
    // Method 1 
    public data = {x: Math.random(), y: Math.random()}; 

    // Method 2 
    private _data$:BehaviorSubject<any> = new BehaviorSubject({x: Math.random(), y: Math.random()}); 
    public data$:Observable<any> = this._data$.asObservable(); 

    constructor() { 
     setInterval(() => { 
      this.data = {x: Math.random(), y: Math.random()}; 
      this._data$.next({x: Math.random(), y: Math.random()}); 
     }, 500); 
    } 
} 

我看到的部件消耗数据的基本方法。只需直接使用变量:

<pre>{{testService.data | json}}</pre> 

并用观察:

<pre>{{(testService.data | async) | json}}</pre> 

似乎都工作,所以有什么用更精细的基于可观测的方法的优势在哪里?

Plunker:https://plnkr.co/edit/1qVDSZwq2NVgZsWFPnii?p=preview

回答

6

观测量推值改变为订阅变化的组件和服务。

变量需要轮询,因此这是一个巨大的性能优势。

尤其是如果存在计时问题,例如组件需要服务从服务器获取的服务的值。 组件如何知道可用的值。

使用可观察的组件只需订阅并在值到达时被调用。

安格拉斯变化检测直接支持observables。 使用ChangeDetectionStrategy.OnPush并且视图使用异步管道(<div>{{myObservable | async}}</div>)绑定到observable时,除非observable推送新值,否则更改检测完全不运行。

Observable还有其他好处。 参见https://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html

0

不同之处在于observables是一个流,你可以有多个订阅者流。而且你还可以获得流的所有优点 - 热点,冷点,答复,过滤器等。