【问题标题】:Error: RouterModule.forRoot() called twice错误:RouterModule.forRoot() 调用了两次
【发布时间】:2018-11-29 21:20:27
【问题描述】:

我有一个组件ListComponent 需要在 2 个模块中使用,其中一个是延迟加载的。所以我创建了声明 ListComponent 的 SharedModule。 ListComponent 使用routerLink 指令,因此它需要RouterModule。于是我导入了RouterModule,导致了这个错误。

core.js:1598 ERROR 错误:未捕获(承诺):错误: RouterModule.forRoot() 调用了两次。延迟加载的模块应该使用 RouterModule.forChild() 代替。

全局搜索显示我只调用了一次RouterModule.forRoot。我的延迟加载模块调用 RouterModule.forChild 并且是唯一的其他路由模块。

我使用完全相同的设置创建了一个 stackblitz,但无法重现该问题。它确实有效。尽管如此,我还是无法弄清楚我的项目有什么不同。 https://stackblitz.com/edit/angular-shared-component-b

【问题讨论】:

  • 问题是我不小心将根 AppModule 导入到我的延迟加载模块中。

标签: angular angular-router


【解决方案1】:

在我的情况下,问题是 AppModule 由 IDE 在 page.modules.ts 之一中自动导入

您可以快速检查是否有问题:

  1. 搜索AppModule
  2. 从除AppModulemain.ts 之外的所有文件中查找所有导入
  3. 删除它们和相应的导入语句。

【讨论】:

    【解决方案2】:

    如果您只需要在SharedModule 中导入RouterModule 以使用routerLink 等指令,您可以像这样简单地导入它:

    // ...
    @NgModule({
      imports: [RouterModule], //  <-- without the .forRoot call
    })
    export class SharedModule { }
    // ...
    

    确保在您的应用程序的基本模块(通常是AppModule,或者在您的情况下可能是AppRoutingModule)中使用RouterModule.forRoot(yourRoutes) 导入它,以便ListComponent 中使用的链接正常工作。

    RouterModule API Docs中查看更多信息

    【讨论】:

    • 这就是我添加它的方式...我认为它隐含地调用了 forRoot?
    • 不,它不会隐式调用forRoot。您可以使用任何适合您需要的替代方案。通常,forRoot 替代项用于基本模块(或基本路由模块)中,而在需要使用诸如routerLink 之类的指令的地方不使用forRoot。此外,当有子路由时,您可以将其与forChild 方法一起使用。
    • 是的,我已经在根 AppRoutingModule 中使用 forRoot,在延迟加载模块中使用 forChild。
    • @inorganik 它应该以这种方式工作。你试过了吗?你有什么想分享的吗?我已经按照说明自己使用了它,并且效果很好。
    • 原来问题是我不小心在我的延迟加载模块中导入了根 AppModule。
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2018-12-03
    • 2013-11-11
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2017-06-25
    • 2013-01-21
    相关资源
    最近更新 更多