我对 Angular 很陌生,据我所知,Subject这是用于多播的标准类。当尝试这个类时,我发现有两种(可能甚至更多)处理其值变化的途径。
Observable直接在组件内使用类型对象
在这种方法中, anObservable在组件内声明如下:
foo$ : Observable<boolean>;
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法在 html 文件中使用:
<p *ngIf="(foo$ | async) as foo">Bar!</p>
Run Code Online (Sandbox Code Playgroud)第二种方法是Subscription在组件内有一个类型对象,该对象分配给某个成员变量:
s: Subscription;
foo: boolean;
Run Code Online (Sandbox Code Playgroud)
其中订阅初始化如下:
constructor(private fbs: FooBarService) {
this.s = fbs.fooObservable.subscribe(v => this.foo = v);
// this.s.unsubscribe() is called within ngOnDestroy()
}
Run Code Online (Sandbox Code Playgroud)
然后 html 将使用如下代码:
<p *ngIf="foo">Bar!</p>
Run Code Online (Sandbox Code Playgroud)除了个人喜好之外,是否有任何理由更喜欢这些方法中的任何一种?
除了个人喜好之外,是否有任何理由更喜欢这些方法中的任何一种?
这类问题不是本文的主题,但给出一般性答案对于社区来说是有价值的。两者之间有足够的区别,值得讨论。
一种方法称为反应式组件,另一种称为有状态组件。
视图使用async管道处理来自可观察量的数据的呈现。如果组件仅使用可观察对象和async管道进行表示,则该组件是无状态的,并通过视图自动对更改做出反应。这有助于为模板创造一种干燥的感觉。
这种方法具有以下优点。
OnPush更加容易。这种方法具有以下缺点。
data.subscribe(value => this.value = value)当开发人员不理解反应式编程时,他们很可能会编写代码。mergeMap()代替switchMap()作为示例。<ng-container *ngIf="data$ | async as data">视图变量数据。debugger;由于组件没有可调试的状态,因此很难进行调试。当组件具有视图模板中使用的属性时,该组件就是有状态的。组件的内部状态必须更改才能表示视图中的更改,这是Angular 中组件的默认类型。
这种方法具有以下优点。
@Input()绑定一开始就是有状态的。debugger;在浏览器中使用更容易,因为您可以看到组件的当前状态。这种方法具有以下缺点。
subscribe()当您混合可观察量时,源代码会因调用而变得混乱。data.subscribe(value => this.data = value).在决定使用两种方法中的哪一种时。我建议从有状态组件开始,然后逐步提高您的反应式组件技能。
根据我的经验,反应式组件是最佳选择,因为它们是可观察流的目的地。这些组件将可观察量组合在一起以创建该数据的响应式视图,并且它们会自动对这些流中的更改做出反应。同时,将数据合并作为目的地更多地是 Angular 中的一种架构设计。所以这是一个更广泛的讨论和主题,但继续学习,你就会到达目的地。
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |