angular - 我可以通过以下方式订阅 RXJS observable 吗?
问题描述
在我的 Angular 组件中,我想订阅很多选择器,为了减少样板,我尝试通过以下方式订阅:
this.store.select(selectFilloutId)
.subscribe(filloutId => this.filloutId=filloutId);
它似乎按照我想要的方式工作,filloutId
我的组件中的值得到了正确的值,但我不完全确定没有我看不到的不需要的副作用。
我的问题是:这是一个好方法,还是我应该完全避免这种情况?
提前致谢!
解决方案
只要您在某个时候取消订阅,该方法就没有任何问题。如果您不取消订阅,一个不想要的副作用是,在您完成订阅后,您将拥有旧订阅。这最终可能导致内存泄漏。
如果您使用从该特定选择器返回的值在模板中显示某些内容,我会在模板中订阅它。这将为您管理订阅生命周期,我认为这比手动订阅要好。如果我能够避免它,我宁愿不手动订阅。
<ng-container *ngIf="fillOutId$ | async; let fillOutId"></ng-container>
如果您依赖fillOutId$
执行其他异步操作,我会使用管道。例如,如果您想获取基于以下内容的列表fillOutId$
:
list$ = this.fillOutId$.pipe(
// map, switchMap, whatever you need to do here
)
然后,在模板中订阅这个:
<ng-container *ngFor="let item of list$ | async; let item">
<a-component-with-list-item-as-input
[item]="item"
></a-component-with-list-item-as-input>
</ng-container>
顺便说一句,ngrx
有一个名为的库@ngrx/component
,它可以让您将上述内容编写为:
<ng-container *ngrxLet="fillOutId$; let fillOutId"></ng-container>
这将让您订阅 observable,但如果该值是虚假的,则不会阻止渲染。
推荐阅读
- javascript - 如何用集合字段序列化表单数据并在服务器端反序列化?
- android - VoskAPI:ExpectToken():io-funcs.cc:200) 无法读取令牌 [从文件位置 0 开始],预期
- kotlin - 多部分表单数据的 Kotlin (Ktor) 请求类
- python - Python 3.6.3 无法导入 _sqlite3 以使用 sqlalchemy 运行 SQlite 数据库
- javascript - 使用 vanilla JS 自定义窗口滚动条以实现浏览器兼容性
- python - 在seaborn boxplot中重命名xticks
- python - 在python/beautifulsoup 中查找
具体的
- html - 如何在悬停时删除边框
- c# - C# 为什么可能的多个枚举不好?
- asp.net - CancellationToken CanBeCanceled 对于 HttpClient 始终为真