angular - 重新分配通过异步管道使用的 Observable
问题描述
假设在我的Component我有一个Observable
字段,它是通过Service检索的,它使用HttpClient
@Component(...)
export class MyComponent {
items$: Observable<readonly Item[]>;
ngOnInit() {
this.items$ = this.findItems();
}
private findItems() {
return this.service
.getItems(...)
.pipe(
// Other code omitted
toArray<Item>()
);
}
}
<app-items [items]="items$ | async"></app-items>
然后,当内部执行操作时MyComponent
,我需要刷新该items$
列表,因此我调用了服务
onButtonPressed() {
this.items$ = this.findItems();
}
问题是,Async
管道会自动订阅新的Observable
吗?考虑到我的策略,我
是否需要要求 a ?
最重要的是,这是正确的方法吗?detectChanges()
OnPush
解决方案
ChangeDetectorRef#detectChanges
要回答我自己的问题,是的,如果使用OnPush
变更检测策略,则需要调用。
constructor(
...
private readonly changeDetectorRef: ChangeDetectorRef
) {}
onButtonPressed() {
this.items$ = this.findItems();
this.changeDetectorRef.detectChanges();
}
如果不使用 second ,似乎没有“更好”的方式来做到这一点[Behavior]Subject
。
编辑:我注意到重新分配和调用detectChanges
会导致闪烁。
最后我选择了BehaviorSubject
替代方案。
private readonly items = new BehaviorSubject<readonly Item[]>([]);
constructor(...) {
items$ = this.items.asObservable();
}
...
this.findItems().subscribe(items => this.items.next(items));
因此,不再重新分配。
推荐阅读
- typescript - 如何在打字稿中调用基类方法
- python - Django 模板仅在查找某个字段时无法评估
- rust - C++ vector::assign() 函数的 Rust 等价物是什么?
- r - 使用 Ggplot 创建分组条形图
- python - 网页抓取但属性返回为无?
- python - 这个递归函数如何产生所有排列?
- r - Install.packages 在 Rstudio 控制台中安装源代码,但在使用 Rscript 时安装二进制文件
- python-3.x - 设置变量的类型,使其与集合的内容相同
- ajax - 如何在 Django 中设置 AJAX 调用的视图/路径?
- c# - 我如何解决 Assert.Is.True (这并不意味着是 False btw)在我的测试驱动开发中失败