我对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>
除了个人喜好之外,还有其他理由更喜欢其中一种方法吗?
答案 0 :(得分:3)
除了个人喜好之外,还有其他理由更喜欢其中一种方法吗?
这些问题不在本文的讨论范围之内,但是对于社区来说,给出一个普遍的答案是有价值的。两者之间有足够的区别,应该加以讨论。
一种方法称为反应组件,另一种称为有状态组件。
该视图使用async
管道处理来自可观察对象的数据表示。如果组件仅使用可观察对象和async
管道进行演示,则该组件为无状态并通过视图自动对更改做出反应。这有助于为模板营造干燥的感觉。
这种方法具有以下优点。
OnPush
更改通知。此方法具有以下缺点。
data.subscribe(value => this.value = value)
。mergeMap()
代替switchMap()
为例。<ng-container *ngIf="data$ | async as data">
将创建一个视图变量 data ,该变量在大多数IDE中都是未知类型。debugger;
进行调试很困难,因为该组件没有要调试的状态。当组件具有视图模板中使用的属性时,该组件为“有状态” 。必须更改组件的内部状态才能表示视图中的更改,这是Angular中组件的默认类型。
这种方法具有以下优点。
@Input()
绑定首先是有状态的。debugger;
更容易,因为您可以看到组件的当前状态。此方法具有以下缺点。
subscribe()
调用而变得混乱。data.subscribe(value => this.data = value)
的代码。在决定使用两种方法中的哪一种时。我建议从有状态组件开始,但要提高您对 active 组件的技能。
根据我的经验,反应性组件是必经之路,因为它们是可观察流的目的地。这些组件将可观察到的东西聚集在一起,以创建该数据的响应视图,并且它们对这些流中的更改自动做出反应。同时,将数据合并为目的地是Angular中的一种架构设计。因此,这是一个更广泛的讨论和主题,但请继续学习,您将会到达那里。