2017-01-25 168 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是一個流,你可以有多個訂閱者流。而且你還可以獲得流的所有優點 - 熱點,冷點,答覆,過濾器等。