rxjs-基于具有初始值的Observable的startWith

时间:2020-09-27 14:56:36

标签: angular typescript rxjs ngrx

我有一个具有查询,排序和分页功能的数据源。所有这些都定义为BehaviourSubjects。我正在尝试实现表的状态保存,还原查询,排序和分页值。

目前,我有下面的代码对此负责:

// params restored from storage
const pageSize = this.params.page?.pageSize ?? 20;
this.pageIndex = this.params.page?.pageIndex ?? 0;

query = new BehaviorSubject<Q | undefined>(params.query);
sort = new BehaviorSubject<Sort<T> | undefined>(params.sort);
page = new Subject<PageEvent>();

用于管理数据查询的代码:

combineLatest([this.query, this.sort])
.pipe(
  switchMap(([query, sort]) => this.page.pipe(
    // combine pageIndex: 0 for query, sort change
    startWith({ pageIndex: this.pageIndex, pageSize } as PageEvent), 
    map(page => [
      this.storeParams({ query, sort, page }),
      this.store.dispatch(
        this.selectAction({ query, page: page.pageIndex, sort, size: page.pageSize })
      )
    ]),
    catchError(error => of()),
  ))
);

它正常工作,但是当排序或查询值更改时,我需要将pageIndex重置为0。如果我将startWith与pageIndex等于0一起使用,那么我将失去从存储中恢复页面值的能力。

要实现此目的,我在排序和查询功能上重置了pageIndex:

sortBy(sort: Sort<T>): void {
  this.pageIndex = 0; // need to remove
  this.sort.next(sort);
}

queryBy(query: Partial<Q>): void {
  this.pageIndex = 0; // need to remove
  this.query.next(query as Q);
}

如何使用单个运算符(即上面的CombineLatest)实现这一目标?

1 个答案:

答案 0 :(得分:0)

类似的东西行吗?每次None具有新值时,只需重置pageIndex。

combineLatest([this.query, this.sort])