首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化ngAfterViewChecked的设计模式

优化ngAfterViewChecked的设计模式
EN

Stack Overflow用户
提问于 2022-08-02 13:12:41
回答 1查看 62关注 0票数 1

我试图通过querySelectorAll方法获取角分量的DOM元素,如下所示:

代码语言:javascript
复制
const widgetHTMLElements: NodeListOf<ChildNode> = document.querySelectorAll('medium-editor')[0].childNodes[0].childNodes

我的第一反应是把它放在ngAfterViewInit方法中,但是我很快就意识到DOM还没有准备好,我知道这一点,因为我已经显示了一些console.log,我得到了以下内容:

有趣的是,返回的NodeList有一个长度为0的,但包含了一些元素,我起初认为这只是Chrome控制台的不一致,但是一旦我试图遍历对象,我会注意到它不工作,所以我想知道这是怎么回事……

无论如何,我认为它可能必须做生命周期挂钩,并且选择了ngAfterViewChecked,好消息是它工作得很好,我可以遍历返回的NodeList,console.log展示了一些更有趣的东西:

显然,存在一个迭代,其中DOM的旧状态很普遍,然后第一个更改允许querySelectorAll返回所需的对象。

问题是ngAfterViewChecked将无限期地执行,所以我想我可能会建立一些布尔标志,一旦querySelectorAll的长度改变或其他什么,它就会设置为true;我只是不希望ngAfterViewChecked在页面大部分空闲的时候继续使用资源,但我也不想错过重大的更改。

我的问题是是否存在某种设计模式来限制ngAfterViewChecked的性能问题,如果是,它是什么样的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-02 13:26:06

理想情况下,应该在调用ngAfterViewInit方法之后填充DOM。我不确定,您关注的DOM是否是基于async API调用填充的。

ngAfterViewChecked背后的原因是在默认更改检测器完成组件视图的更改检查之后调用的。与其使用document.querySelectorAll,我建议您使用ViewChildren

代码语言:javascript
复制
// I'm assuming below `menu-editor` is component selector
@ViewChildren('medium-editor') mediumEditors: QueryList<MenuEditorComponent>;

ngAfterViewInit() {
   this.mediumEditors.changes.subscribe((mediumEditors) => {
      console.log('mediumEditors', mediumEditors);
      // use nativeElement property of each item to access DOM
      mediumEditors.forEach(i => console.log(i.nativeElement));
   });
}

在这里,您可以以角度的方式监视menuEditors DOM元素。menu-editor元素添加/删除中的任何更改都将在change订阅中发出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73208205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档