【问题标题】:Angular ngAfterViewInit being called after every changeDetection每次 changeDetection 后调用 Angular ngAfterViewInit
【发布时间】:2017-10-21 22:25:40
【问题描述】:

来自ngAfterViewInit 的角度文档

ngAfterViewInit()

Angular 初始化组件后响应 视图和子视图。

在第一个 ngAfterContentChecked() 之后调用一次

只有组件的钩子。

我有一个组件 C 嵌套在组件 T

组件 C 实现了以下钩子。

ngAfterViewInit(): void {
        console.log("afterViewInit");
        debugger;
    }

组件 T 是一个表格 - 每当用户单击一个单元格时,都会对其进行更改检测。

组件C可以在表格单元格中找到。

当我单击单元格时,我可以看到afterViewInit 登录到控制台。

我的堆栈跟踪如下:

DynamicComponentWrapper.ngAfterViewInit (动态组件包装器.ts:72) View_TableComponent18.detectChangesInternal (/TableModule/TableComponent/component.ngfactory.js:904) AppView.detectChanges (view.js:425) DebugAppView.detectChanges (view.js:620) ViewContainer.detectChangesInNestedViews (view_container.js:67) View_TableComponent17.detectChangesInternal (/TableModule/TableComponent/component.ngfactory.js:962) AppView.detectChanges (view.js:425) DebugAppView.detectChanges (view.js:620) ViewContainer.detectChangesInNestedViews (view_container.js:67) View_TableComponent15.detectChangesInternal (/TableModule/TableComponent/component.ngfactory.js:1043) AppView.detectChanges (view.js:425)

问题

是什么导致 ngAfterViewInit 在父级更改时被调用?组件是否被重新渲染 - 即 - 从 DOM 中移除并替换?

我该如何防止这种情况发生? - 即 - 我如何确保 ngAfterViewInit 只被调用一次

更新: 在将 Component CComponent T 都更改为使用 ChangeDetectionStrategy.OnPush 之后,任何更改仍会调用 afterViewInit

【问题讨论】:

  • 这是由 Angular 变化检测策略引起的。如果进行了更新,它会检查您的整个组件。您可以尝试更改检测策略,但这取决于您如何在组件之间进行绑定。最好的方法是使用带有哑/智能组件的清晰输入/输出。如果您依赖路由器插座并且无法使用输入/输出,那么您应该能够在没有ngAfterViewInit 的情况下使用您想要的东西并使用服务来管理您的数据。
  • @AlexBeugnet 我对ChangeDetectionStrategy.OnPush 进行了试验,但无济于事 - 当没有输入更改时仍会触发更改检测。

标签: angular


【解决方案1】:

这可能是由于子组件使用的一些外部指令也绑定了您提到的组件中的值。

相关帖子:

Angular 7: ChangeDetectorRef detectChanges() causes infinite loop when called from inside a subscription

【讨论】:

猜你喜欢
  • 2018-12-11
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多