javascript - Angular2 在 dom 完成渲染后执行操作

标签 javascript angular angular2-template

我在页面上有一个很大的 ngx-bootstrap Accordion 。当我打开一些较低的 Accordion 时,我希望它滚动页面,以便打开的 Accordion 从窗口顶部开始。我用 scrollIntoView 实现了滚动部分,但现在的问题是在正确的时间执行它。我目前在 ngAfterViewChecked 中执行此操作,但 viewChecked 被多次触发(mousemove、mouseenter 等...)。有没有一种方法可以仅在 DOM 完成渲染后与 angular2+ changeDetection 分开触发一段代码?

解决方案

这是开始起作用的解决方案。

constructor(elementRef: ElementRef) {
    this.elementRef = elementRef
  }

getData(){
   this.getService().then(result => {
      #do stuff with result
      setTimeout(() => this.scrollToBegin());
    }).catch((err: any) => {
    });
}

scrollToBegin(): any{
      this.elementRef.nativeElement.scrollIntoView();
    }

最佳答案

据我所知,您只有 ngAfterViewCheckedngAfterViewInit 用于检测 dom 更新。

根据我的经验,有时您需要在 settimeout 中编写用于 dom 更改的代码,以为此安排一个宏任务(异步更新),以便您的代码将在下一个更改检测周期中运行(这正是您所需要的)。有关详细信息,请参阅 this article

将您的 could 放在 block 代码末尾的 settimeout 中(并将其从 ngAfterViewChecked 中删除)。 一些例子:

setTimeout(() => htmlInputElement.focus()); // focus an input
setTimeout(() => htmlElement.scrollIntoView()); // scroll into view

关于javascript - Angular2 在 dom 完成渲染后执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53477632/

相关文章:

javascript - 在 leaflet.js 和 leaflet.snap 中编辑多边形

json - 如何使用 'npm install' 下载依赖项?

Angular Material 表可扩展表行不扩展?

angular - Angular 模板中的可重用片段

大型项目列表的 Angular 2 性能优化

javascript - 将对象值转换为新数组

javascript - 为什么当我向主干模型获取添加数据选项时,它不会触发回调

javascript - 无法找到带有查询字符串参数的文档

Angular 垫表 : - Sort icon missing on custom sort

Angular Router.url 不更新当前路径