angular - 使用异步管道时如何执行业务逻辑?
问题描述
我一直在使用异步管道进行直接绑定,例如:
组件.ts:
uiData$ = this.someService.uiData$;
HTML:
<ng-container *ngIf="uiData$ | async as holdingData">
最近业务逻辑发生了一些变化,我需要对这个管道返回的数据进行一些检查。所以我想这样做:
<ng-container *ngIf="uiData$ | async as holdingData">
{{ storeHoldingData(holdingData) }}
后面的代码:
storeHoldingData(holdingData: HoldingsData): void {
this.holdingData = holdingData;
this.doSomething();
}
这让我改变了检测相关的问题,所以我想知道这是否是一个很好的途径,或者我将跳回传统的 ngOnit() 模式订阅。
我可以开始,changeDetection: ChangeDetectionStrategy.OnPush
然后声明 BheaviorSubjects 以传播更改。
新的业务逻辑还为页面上的 Tab 控件中的 Tabs 做出了一些隐藏/显示决策。
在坚持使用异步管道的同时,有没有更好的方法来处理这种变化?
解决方案
我同意这些评论:这是一种不好的做法。在模板内部调用的函数会受到重创,是性能的噩梦。
也就是说,您应该始终努力changeDetection: ChangeDetectionStrategy.OnPush
,而async
烟斗是您在此任务中的朋友。
至于你应该怎么做?这实际上取决于doSomething()
方法中发生了什么。使用tap
运算符绝对是一种选择,并且专门针对副作用。另一个选项放在shareReplay(1)
该可观察流的末尾。吨
uiData$ = this.someService.uiData$.pipe(shareReplay(1))
从那里,只需在您需要的任何其他地方重复使用相同的 observable,它就不会进行另一个服务调用。你甚至可以调用 subscribe 来订阅它ngOnInit
。
推荐阅读
- python - 使用 Django 时 VS Code 中的 pylance(reportMissingModuleSource) 错误
- c - 在星号后取消函数指针间距
- python - 从网站上的元数据中抓取文本而不使用周围的标签
- mysql - 如何优化这个 SQL 查询?(在 MySQL 上运行)
- python - 为什么验证错误未显示在表单中
- string - 如何将“[int, int..]”形式的字符串转换为 int 列表?
- python-3.x - 获取上一季度月份的结束日期,并从 pyspark 中的日期列获取上一年的所有月份结束日期
- reactjs - 带有版本控制的缓存破坏似乎不起作用
- c# - 是否可以将 WPF ListBoxItem 的背景设置为存储为对象属性内的字符串的十六进制颜色?
- google-apps-script - 我可以使用 Google 表单更新 Google 表格电子表格吗?