Angular 仅为第一个事件触发CombineTest

Angular 仅为第一个事件触发CombineTest,angular,typescript,rxjs,observable,combinelatest,Angular,Typescript,Rxjs,Observable,Combinelatest,我有3个事件要合并,当其中一个被触发时,调用服务。我使用了combinelatetest,但它仅在过滤器changed触发第一个事件时起作用 filterChanged是一个本地事件,而其余的是来自子组件的事件。我如何解决这个问题,甚至从页面初始化发出一个事件 filterChanged = new EventEmitter<boolean>(); paginatorChanged = new EventEmitter<MatPaginator>(); sortChang

我有3个事件要合并,当其中一个被触发时,调用服务。我使用了
combinelatetest
,但它仅在
过滤器changed
触发第一个事件时起作用

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);
}
filterChanged=neweventemitter();
paginatorChanged=新的EventEmitter();
sortChanged=新的EventEmitter();
ngAfterViewInit():void{
组合测试(
这是帕吉纳托的改变,
这件事很糟糕,
这个过滤器被更换了
).烟斗(
startWith([null,null,null]),
开关映射(值=>{
常数paginator=值[0];
常量排序=值[1];
常量过滤器=值[2];
返回this.service.getFiltered(分页器、排序、过滤器);
})).subscribe(data=>this.data=data);
}    
applyFilter():void{
this.filterChanged.emit(true);
}
onPaginatorChanged(paginator):无效{
this.paginatorChanged.emit(paginator);
}
onSortChanged(排序):无效{
this.sortChanged.emit(sort);
}

谢谢

这个问题目前还不清楚,但是如果您希望触发
CombineTest
,而
filterChanged
observable至少发出一次,那么我认为您使用的
startWith
操作符是错误的。它应该通过管道分别连接到每个可观察到的源

试试下面的方法

ngAfterViewInit():void{
组合测试(
this.paginatorChanged.pipe(startWith(null)),
this.sortChanged.pipe(startWith(null)),
this.filterChanged.pipe(startWith(null))
).烟斗(
开关映射(值=>{
常数paginator=值[0];
常量排序=值[1];
常量过滤器=值[2];
返回this.service.getFiltered(分页器、排序、过滤器);
})
).subscribe(data=>this.data=data);
}

此外,对于本地多播观测,您可以使用RxJS
Subject
(或它的兄弟姐妹),而不是使用特定角度的
EventEmitter

,这太好了,谢谢。我认为我可以对所有事件结果使用startWith(),但需要为每个事件结果指定startWith()。这是一个重构,在从智能组件中删除所有过滤器、排序和分页器之后,我将更改带有主题的事件(在服务内部,甚至是ngrx选择器(因为已经在应用程序中使用))。谢谢