此错误与在 ngOnInit() 中初始化的 this.events$ 有关
这个问题与其他问题非常相似,但在执行时间方面仍然略有不同。
我有简单的 zip 来合并两个可观察的,例如:
zip(this.eventService.searchedEvent$, this.events$)
.subscribe(([input, events]) => console.log(input, events))
问题是我不想在 ngOnInit() 中执行它,它完全可以正常工作。我的意思是在加载数据时在 ngAfterViewInit() 中执行它。应用流程:
通过 ngOnInit() 加载组件中的数据。
通过服务从搜索栏中发出值,如下所示: https ://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service
从 ngAfterViewInit() 中的服务获取值
请注意,当我简单地对 observable 执行 subscribe() 时,这是可行的:
ngAfterViewInit() {
// this.eventService.searchedEvent$.subscribe(console.log)
}
不幸的是,我需要合并来自搜索输入的 observable 和 observable 的数据源,所以我试图将它们结合起来:
ngAfterViewInit() {
zip(this.eventService.searchedEvent$, this.events$)
.subscribe(([input, events]) => console.log(input, events))
}
但它仍然没有被解雇。为什么它在 ngOnInit() 中有效,但在 ngAfterViewInit() 中无效,简单的订阅是在 ngAfterViewInit() 中动态发出的?有什么解决办法吗?
编辑:
ngOnInit() {
this.isLoading$ = this.store.pipe(select(selectEventsLoading))
this.events$ = this.paginationService.page$.pipe(
switchMap(pageIndex => this.store.pipe(
delay(0),
select(selectEventsPageByGenre(this.musicGenre, { pageIndex: pageIndex, pageSize: PAGE_SIZE })),
map(events => {
if (events.length > 0) {
return events;
}
this.store.dispatch(new EventsPageRequested({
musicGenre: genreToEnum(this.musicGenre),
page: {
pageIndex: pageIndex,
pageSize: PAGE_SIZE
}
}));
return [];
}),
tap(events => {
this.isEmpty$ = of(this.isListEmpty(events))
this.paginationService.isIncrementEnabled(events)
})
))
);
我注意到的是,在 ngOnInit() 中使用 zip 会获取值,直到第一次删除字符,例如:
- 插入字符:
- 输入:'a' -> 发出'a'
- 输入:'ab' -> 发出'ab'
- 输入:'abc' -> 发出'avc'
- 删除 1 个字符:
- 输入:'ab' -> 没有发射,
- 重试:
- 输入:'abc' -> 没有发射,