ngAfterViewInit()
是Angular文档中的一个钩子。
ngAfterViewInit()
在Angular初始化组件的视图和子视图后进行响应。
在第一次调用
ngAfterContentChecked()
之后仅调用一次。这是一个仅适用于组件的钩子。
我有一个嵌套在组件T中的组件C
组件C实现了以下钩子。
ngAfterViewInit(): void {
console.log("afterViewInit");
debugger;
}
当用户点击单元格时,会触发表格组件T的变更检测。
表格单元格中可以找到组件C。
每当我点击单元格,就可以在控制台中看到afterViewInit
日志。
我的堆栈跟踪如下:
DynamicComponentWrapper.ngAfterViewInit (dynamic-component-wrapper.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?
更新:在将组件C和组件T都更改为使用ChangeDetectionStrategy.OnPush之后,afterViewInit
仍会在任何更改时被调用。
ngAfterViewInit
的情况下使用服务来管理数据以实现您想要的效果。 - Alex BeugnetChangeDetectionStrategy.OnPush
,但无济于事 - 即使没有任何输入发生变化,仍然会触发变更检测。 - Daniel Cooke