我正在与 combineLatest 和 scan rxjs 运算符(使用 Angular 8)作战。基本上,我正在显示一个可以过滤的列表。
所以我有第一个 Observablelist$ = this.api.getAll()
和第二个Observable filteredList$ = combineLatest(this.list$, this.form.valueChanges())
,在我的 HTML 中,我filteredList$
使用filteredList$ | async
. 这很好用(意思是,表单中的任何更改都会更新 my filteredList$
)
但是,最终用户可以更新列表中的一个元素;当他这样做时,我会以这种方式更新我的list$
Observable:
this.api.update(listElement)
.subscribe((updatedElmt) => {
this.list$ = this.list$.pipe(
concatMap(value => of(...value)),
scan((acc, listElmt) => listElmt._id === updatedElmt._id ? [...acc, updatedElmt] : [...acc, listElmt], []),
);
});
这也很有效。
但是,combineLatest
不会触发,因此,在我刷新页面之前,我的 UI 永远不会更新。我认为这是因为list$
指针没有改变,所以没有理由触发 combineLatest ;但我怎么能强迫它?
顺便说一句,使用 changeDetector 来检测Changes 或 markForCheck 不起作用。