我有三个观察点:
query$: Observable<string> = this.q$.pipe(tap(() => this.page$.next(0));
filter$: Observable<number> = this.f$.pipe(tap(() => this.page$.next(0));
page$ = new BehaviorSubject<number>(0);
combinetLatest({
query: this.query$,
filter: this.filter$,
page: this.page$
})
.pipe(
switchMap(({ query, filter, page }) => {
...
})
);
每当它们中的任何一个发出时,我都必须将它们的值顺流而下.但是,使用combineLatest
会导致至少多两个冗余emits .我试图连入distinctUntilChanged()
,但这也会在某些时候产生一个多余的emits .
请协助:(或者可能我的整个方法/ idea 是不正确的,我不应该将page$
作为query$
或filter$
的副作用?
从某种意义上讲,我不在乎"页面"的值,因为在"查询"或"过滤"emits 的情况下,它总是0.但我确实关心"page"发出时的"Query"和"Filter"值.因此,它似乎变成了两个独立的可观察到的东西?但我想将其分配给组件属性,以便将其与模板中的"异步"管道一起使用,因此对于两个不同的可观察对象,我无法...
Update:很抱歉大惊小怪;我本应该详细说明的.
在输入字段输入时发出query$
.
filter$
在 Select 框更改时发出.
代表"页码"的page$
在点击"加载更多"按钮时发出.
所以我的 idea 是有一个组件属性:
objects$: Observable<object[]> = combineLatest({
query: this.query$,
filter: this.filter$,
page: this.page$
}).pipe(
switchMap(({ query, filter, page }) => this.someService.sendApiRequest(query, filter, page)),
scan((acc, { objects}) => {
if (page !== 0) {
return [...acc, ...objects];
} else {
return objects;
}
}, [])
);
并在带有async
个管道的模板中使用它:
<div *ngFor="let x of objects$ | async">...</div>
基本上,只要用户输入查询、更改筛选器或加载更多项,就可以获取结果.