2

我有 3 个要组合的事件,当其中一个事件被触发时,调用该服务。我用过combineLatest,但只有当第一个事件被filterChanged.

filterChanged是一个本地事件,而其余的是来自子组件的事件。我该如何解决这个问题,以发出其中一个事件,甚至从页面初始化开始?

filterChanged = new EventEmitter<boolean>();
paginatorChanged = new EventEmitter<MatPaginator>();
sortChanged = new EventEmitter<{}>();

ngAfterViewInit(): void {
   combineLatest(
      this.paginatorChanged,
      this.sortChanged,
      this.filterChanged
   ).pipe(
      startWith([null, null, null]),
      switchMap(value => {
      const paginator = value[0];
      const sort = value[1];
      const filters = value[2];
    
      return this.service.getFiltered(paginator, sort, filters);
   })).subscribe(data => this.data = data);
}    

applyFilter(): void {
  this.filterChanged.emit(true);
}

onPaginatorChanged(paginator): void {
  this.paginatorChanged.emit(paginator);
}

onSortChanged(sort): void {
  this.sortChanged.emit(sort);
}

谢谢

4

1 回答 1

2

目前这个问题还不清楚,但如果你希望在combineLatest 没有可观察到的情况下触发filterChanged至少一次发射,那么我会说你使用了startWith错误的操作符。它应该单独通过管道传输到每个可观察的源。

尝试以下

ngAfterViewInit(): void {
  combineLatest(
    this.paginatorChanged.pipe(startWith(null)),
    this.sortChanged.pipe(startWith(null)),
    this.filterChanged.pipe(startWith(null))
  ).pipe(
    switchMap(value => {
    const paginator = value[0];
    const sort = value[1];
    const filters = value[2];
  
    return this.service.getFiltered(paginator, sort, filters);
    })
  ).subscribe(data => this.data = data);
}

同样对于本地多播 observables,您可以使用 RxJS Subject(或它的兄弟姐妹)而不是使用 Angular 特定的EventEmitter.

于 2021-01-11T10:45:30.897 回答