5

我是 Angular 2-4 的新手,现在在使用 f5 重新加载页面时遇到问题。正如我所看到的,问题是我正在朝着同一条路线导航,因此 ngOnInit() 没有再次加载。在 ngOnInit() 中,我初始化了我使用的一些变量和动态形式。我已经看到了一个可能的解决方案,即订阅路由的参数并调用一个初始化所有内容的方法。像这样的东西:

this.activeRoute.params.subscribe(
params => {
   this.paramX = params['paramX'];
   this.initializeComponent();
});

private initializeComponent() {

}

  这是正确的方法吗?这是一个好习惯还是我应该以另一种方式来做?提前致谢。

4

1 回答 1

4

正式化我的评论:如果您使用浏览器的刷新/重新加载,或Location.reload()刷新 Angular 应用程序上的任何页面,您确实会ngOnInit()再次运行,以及所有其他生命周期钩子

这是因为您从头开始重新加载整个应用程序,一直到platformBrowserDynamic().bootstrapModule(AppModule)然后重新引导所有内容。这就是 refresh 的作用

如果您需要演示,请打开开发人员工具并在组件中设置断点ngOnInit()并点击刷新。您将在断点处停止。

您后来评论中的措辞“进入同一条路线”假定已经有一条已知路线。没有,因为应用程序完全重新引导。

您可能正在考虑router.navigate([...])使用相同的路径参数调用您当前的位置。这不会发出NavigationStart事件,路由器也不会尝试加载任何东西(因为为什么会这样,你还没有导航到任何地方)。反过来,它不会调用ngOnInit().

也就是说,的,您当前处理路径参数的方式是最好的解决方案,主要是因为它允许您对路径中的更改做出反应,而不会强制您重新初始化组件。

换句话说,如果你所有的 Component 逻辑都依赖于设置 OnInit 的动态路径参数,那么如果在组件实例化后参数发生变化会发生什么?没有什么。

于 2017-10-30T21:49:24.737 回答