[英]Observable vs Subscription when using Subject values
我對Angular很陌生,從我可以知道Subject
是用於多播的標准類。 嘗試該課程時,我發現有兩種(可能甚至更多)途徑可以處理其價值的變化。
直接在組件內使用Observable
類型對象
在這種方法中,在組件內聲明一個Observable
,如下所示:
foo$ : Observable<boolean>;
然后使用以下方法在html文件中使用:
<p *ngIf="(foo$ | async) as foo">Bar!</p>
第二種方法是在組件中具有一個Subscription
類型的對象,該對象分配給某些成員變量:
s: Subscription; foo: boolean;
訂閱初始化如下:
constructor(private fbs: FooBarService) { this.s = fbs.fooObservable.subscribe(v => this.foo = v); // this.s.unsubscribe() is called within ngOnDestroy() }
html然后將使用如下代碼:
<p *ngIf="foo">Bar!</p>
除了個人喜好之外,是否有任何理由更喜歡其中一種方法?
除了個人喜好之外,是否有任何理由更喜歡其中一種方法?
這些問題不在本文的討論范圍之內,但是對於社區來說,給出一個普遍的答案是有價值的。 兩者之間有足夠的區別,應該加以討論。
一種方法稱為反應性組件 ,另一種稱為有狀態組件 。
該視圖使用async
管道處理來自可觀察對象的數據表示。 如果組件僅使用可觀察的對象和async
管道進行表示,則該組件是無狀態的,並通過視圖自動對更改做出反應。 這有助於使模板更干燥 。
該方法具有以下優點。
OnPush
更改通知的使用變得更加容易。 該方法具有以下缺點。
data.subscribe(value => this.value = value)
。 mergeMap()
代替switchMap()
為例。 <ng-container *ngIf="data$ | async as data">
將創建大多數IDE中未知類型的視圖變量數據 。 debugger;
很難debugger;
因為該組件沒有要調試的狀態。 當組件具有視圖模板中使用的屬性時,該組件為有狀態的 。 必須更改組件的內部狀態才能表示視圖中的更改,這是Angular中組件的默認類型。
該方法具有以下優點。
@Input()
綁定首先是有狀態的 。 debugger;
更容易debugger;
在瀏覽器中,因為您可以看到組件的當前狀態 。 該方法具有以下缺點。
subscribe()
調用而變得混亂。 data.subscribe(value => this.data = value)
。 在決定使用兩種方法中的哪一種時。 我建議從有狀態的組件開始,但是將您的技能提高到反應性的組件。
根據我的經驗,反應性組件是必經之路,因為它們是可觀察流的目標 。 這些組件將可觀察到的東西聚集在一起,以創建該數據的響應視圖,並且它們對這些流中的更改自動做出反應。 同時,將數據合並為目的地更多是Angular中的體系結構設計。 因此,這是一個更廣泛的討論和主題,但請繼續學習,您將會到達那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.