javascript - Angular:等到所有子组件都呈现后再运行代码

标签 javascript angular rxjs

我有一个位于应用程序顶层的指令,它通过 document.querySelector 查询元素并将它们交给 fromEvent。问题是,当指令的 ngAfterViewInit 中的代码运行时,DOM 尚未完全呈现,因此元素查询返回 null。

我可以在 setTimeout 中以任意时间运行代码,但这似乎不是一个可持续且灵活的解决方案。

关于如何优雅地处理这个问题有什么想法吗?

现在,我的代码看起来像这样的一些变体:

ngAfterViewInit() {
  const trackedEl = document.querySelector('#myInput');
  const input$ = fromEvent(trackedEl, 'input')
    .pipe(
      map((inputEvent: any) => inputEvent.target.value)
    )
    .subscribe((v) => {
      console.log(`Got to the observable:: ${v}`, count++);
    })
}

最佳答案

我最终找到了我一直在寻找的解决方案。

子元素没有及时呈现可能是因为它们正在响应一些尚未返回响应的未完成的 http 事件。阅读变更检测和 ngZone 的文档后,看起来未完成的 http 事件算作“微任务”。

下面的代码对我有用。

ngOnInit() {
    this.ngZone.onMicrotaskEmpty.pipe(take(1)).subscribe((a) => {
      this.initiateElementEventListeners();
    });
}

关于javascript - Angular:等到所有子组件都呈现后再运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70806492/

相关文章:

javascript fullcalendar 日期时间搞砸了

javascript - 检索带有特殊字符的 json key

javascript - 如何创建一个可以在单项和批处理模式之间切换的 Rx (RxJS) 流?

angular - 3 秒后自动关闭对话框 angular 5 observables

javascript - 删除 CSS3 动画

c# - 将 JavaScript 转换为 C# - 数组

javascript - 为什么在 Angular 中传递 $event(在处理 DOM 事件时)是一种可疑的做法

angular - 如何在 Angular Universal 中向 <body> 添加类?

angular - 如果我没有捕获订阅,它会抛出错误吗?

angular - RXJS 对对象使用 ForkJoin