问题
Angular 运行报错 RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.
具体报错
core.js:5847 ERROR Error: Uncaught (in promise): Error: RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.
Error: RouterModule.forRoot() called twice. Lazy loaded modules should use RouterModule.forChild() instead.
at provideForRootGuard (router.js:5561)
at _callFactory (core.js:18524)
at _createProviderInstance (core.js:18480)
at initNgModule (core.js:18410)
at new NgModuleRef_ (core.js:19137)
at createNgModuleRef (core.js:19126)
at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.js:27949)
at NgModuleFactory_.push../node_modules/@angular/core/fesm5/core.js.NgModuleFactory_.create (core.js:28653)
at MapSubscriber.project (router.js:3602)
at MapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/map.js.MapSubscriber._next (map.js:35)
at resolvePromise (zone.js:852)
at resolvePromise (zone.js:809)
at zone.js:913
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:24340)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
at drainMicroTaskQueue (zone.js:601)
出现原因
我给我的网站新增加一个继承AfterViewInit的component
- 小知识:关于angular的AfterViewInit
一个生命周期钩子,会在 Angular 完全初始化了组件的视图后调用。 定义一个 ngAfterViewInit() 方法来处理一些额外的初始化任务。
分析
看报错主要是说 RouterModule.forRoot()被调用两次。延迟加载的模块应该使用RouterModule.forChild()。意思就是我在哪个延迟加载的模块可能再次调用了RouterModule.forRoot(),其实本应该调用RouterModule.forChild(),那可能就是我在包含通过RouterModule.forChild()加载路由的模块里面加载了新增加的component导致出现这个问题,分析了一般发现没结果,于是把新增的component全删除了,结果还是报错,what????快奔溃,于是准备看下git的代码修改记录,发现啥时候不小心在我的一个子模块里面导入了AppModule,这导致在加载子模块时再次调用根AppRoutingModule,因此两次调用RouterModule.forRoot()终于真相大白,我也很奔溃,找了很久
结论
要细心