【问题标题】:forChild and forRoot usage with router moduleforChild 和 forRoot 与路由器模块一起使用
【发布时间】:2019-07-28 02:37:12
【问题描述】:

在使用 RouterModule 时,我对 forRoot 子和 forChild 行为有点困惑。

如果我在路由模块中使用 RouterModule.forChild(routes),并在 app.module.ts 中导入相同的内容,然后如果我尝试使用 router-outletapp.component.ts 中,它会抛出错误。

根据定义:

forChild 创建一个包含所有指令和给定路由的模块,但不包括路由器服务。

路由器服务用于浏览器位置检测,但为什么它无法找到 router-outlet 指令,因为定义清楚地说明它将包含所有指令。

但是如果在一个特性模块中做同样的事情,它就可以正常工作。

很抱歉没有发布代码,因为它会很长。

【问题讨论】:

  • 您是否只导入 RouterModule.forChild(routes) 而不是 forRoot()? Angular 遇到的错误是什么?
  • 没有 ChildrenOutletContexts 的提供者!,我只是想深入了解一下,所以我尝试做 RouterModule.forChild(routes),通常在主模块中你应该做 RouterModule.forRoot。

标签: angular angular-routing


【解决方案1】:

RouterModule.forRoot() 需要在AppModule 中。它是实例化路由器服务的一种。所有其他模块将使用RouterModule.forChild([]) 来处理路由。

您应该在一个应用中只使用一个 forRoot

【讨论】:

  • forRoot 将实例化我同意的路由器服务,但如果您看到角度路由器 git hub 代码。 github.com/angular/angular/blob/master/packages/router/src/…(第94行,据说会提供指令),所以我比较关心,为什么找不到router-outlet指令。
  • 这是因为提供者ChildrenOutletContextsROUTER_PROVIDERS 的一部分。仅当您使用 forRoot 时,这才是一个依赖项。不是当你使用forChildrouter-outlet 需要ChildrenOutletContexts 的实例,但由于forChild 没有提供它,所以会报错。
  • 那么,Feature Module 是如何工作的?,它是从 App Modules 中获取的
  • 在使用 forRoot 之前,它不应该在任何地方工作。如果你能正常工作,请在 stackblitz 上重现它。
  • 如果您在 AppModule 中使用 forRoot,则所有实例都可供功能模块使用。
【解决方案2】:

检查router source code

forChild 注册路由,而forRoot 注册路由并配置/初始化路由器本身

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2017-01-03
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多