为啥每次都重复调用 ngOnInit

Posted

技术标签:

【中文标题】为啥每次都重复调用 ngOnInit【英文标题】:Why ngOnInit is getting called every time repeatedly为什么每次都重复调用 ngOnInit 【发布时间】:2018-06-13 18:50:45 【问题描述】:

Per Angular (https://angular.io/api/core/OnInit 说 ngOnInit 在第一次检查指令的数据绑定属性之后立即调用,并且在检查其任何子项之前。当指令被实例化。),

所以 ngOnInit 应该被调用一次,但如plunker 所示(即来自https://angular.io/tutorial/toh-pt5 的副本),我只修改了 app/heroes/heroes.component.tsapp/dashboard/dashboard.component.ts 拥有 console.log

并且当F12(开发者工具)打开时,当路由改变时控制台会重复显示日志。

我看过 why ngOnInit called twice? , Difference between Constructor and ngOnInit , Angular 2 App Component ngOnInit called twice when using iframe , ngOnInit called everytime i change route

但不明白为什么每次都调用 ngOnInit。

console.log("ngOnInit in All Heroes");
console.log("ngOnInit InDashBoard");

【问题讨论】:

【参考方案1】:

当路由改变时组件被销毁,然后当路由改变回来时组件被再次初始化

将此添加到DashboardComponent 以亲自查看:

    ngOnDestroy() 
      console.log("ngOnDestroy InDashBoard");
    

【讨论】:

【参考方案2】:

我的问题是我引导子组件的方式。 在我的@NgModule 装饰器的元数据对象中,我在引导属性中传递了child componentparent component。 在引导属性中传递子组件正在重置我的子组件属性并使OnInit() 被触发两次。

@NgModule(
 imports: [ BrowserModule,FormsModule ], // to use two-way data binding ‘FormsModule’
declarations: [ parentComponent,Child1,Child2], //all components
 //bootstrap: [parentComponent,Child1,Child2] // will lead to errors in binding Inputs in Child components
 bootstrap: [parentComponent] //use parent components only
 )

【讨论】:

【参考方案3】:

我可能是错的,但我相信您希望 OnInit 触发两次。您需要能够将组件的初始实例化与顺序实例化分开。因此,如果我想要第一次执行某些东西,并且只是第一次将它放入构造函数中。如果组件没有延迟加载,则构造函数只会在初始实例化时被调用。但是,如果我想在每次路由返回到组件时调用一些东西,它会进入 onInit。

【讨论】:

施工方不应该收费

以上是关于为啥每次都重复调用 ngOnInit的主要内容,如果未能解决你的问题,请参考以下文章

为啥每次渲染都会调用 `useEffect` 的清理功能?

为啥我的函数每次调用时都会创建一个新对象?

在循环条件下:为啥 strlen() 每次都被调用,而 vector.size() 只被调用一次? [复制]

为啥每次调用 Spring MVC 服务中的简单方法都比静态方法慢?

如果我每次都从不同的线程调用事件,为啥会从同一个线程触发事件处理程序的多次执行?

为啥每次递归都使用这么多的堆栈空间?