【发布时间】:2020-07-08 04:13:05
【问题描述】:
要跟进的最小 Stackblitz 回购:https://stackblitz.com/edit/angulare-backend-calls-so
假设我有一个为我提供数据的后端,在本例中是一个带有 ID 的简单计数器。
{id: number, counter: number}
我想在async 管道的帮助下在我的app.component.html 中显示收到的值,这样我就不会创建任何不必要的订阅。
一段时间后,用户决定增加计数器,现在我需要一个 ID,以便后端知道要增加哪个计数器对象。但由于我不能直接访问它,这并不容易。我不想.pipe(first())订阅只是为了打电话。
解决此问题的一种方法是将app.component 中的方法签名更改为也获取计数器 ID 并从模板内部传递它。但是如果我不使用*ngIf="(obs$ | async) as obs",我看不到这种方法有效,因为我必须使用(click)(或其他)处理程序内的另一个async管道再次订阅可观察的计数器对象,或者是这样预期的行为/最佳实践?如果我依赖多个流(click)=copyTimer((counter1|async).id, (counter2|async).id) 肯定不会是最佳解决方案会发生什么
第一个问题因此:当使用流作为主要数据源时,处理依赖 ID 的后端调用的最佳方法是什么?
让我们先跳过一些时间,假设服务器正确获取了 ID 并相应地增加了计数器。我将如何处理更新视图? 我所做的只是从后端返回完整的计数器对象,这可能适用于这个特定的最小示例,但如果使用更复杂的对象(我假设)会失控。
我显然可以只使用this.countingObj = this.appService.increaseCounter(id),但第二个组件会错过这些更新,因此更新需要在服务内部进行。
第二个问题:我是否应该在服务中保留一个 BehaviorSubject,它跟踪变化并作为 get 调用的代理,或者如何注意到应用程序范围内的对象变化它在所有组件中都是一致的吗?
【问题讨论】: