Angular 仅为第一个事件触发CombineTest
我有3个事件要合并,当其中一个被触发时,调用服务。我使用了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
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选择器(因为已经在应用程序中使用))。谢谢