0

此错误与在 ngOnInit() 中初始化的 this.events$ 有关

这个问题与其他问题非常相似,但在执行时间方面仍然略有不同。

我有简单的 zip 来合并两个可观察的,例如:

zip(this.eventService.searchedEvent$, this.events$)
    .subscribe(([input, events]) => console.log(input, events))

问题是我不想在 ngOnInit() 中执行它,它完全可以正常工作。我的意思是在加载数据时在 ngAfterViewInit() 中执行它。应用流程:

  1. 通过 ngOnInit() 加载组件中的数据。

  2. 通过服务从搜索栏中发出值,如下所示: https ://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

  3. 从 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' -> 没有发射,
4

0 回答 0