【问题标题】:Angular 2 No provider for RouterOutletMap when lazy loadingAngular 2延迟加载时没有RouterOutletMap的提供者
【发布时间】:2016-10-18 12:08:22
【问题描述】:

我正在使用最新的 Angular CLI 版本 (16),我正在尝试延迟加载路由,但由于某种原因它失败了,我找不到任何新的问题或解决方案。

文件夹结构:

core.component.html:

<router-outlet></router-outlet>

core.component.ts:

import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {RouterModule} from '@angular/router';

// Modules
import {AdminAreaModule} from './+admin-area';

// Services
import {GlobalsService, RegexService, UtilsService} from './shared';

// Main app component
import {CoreComponent} from './core.component';

@NgModule({
  imports: [
    BrowserModule,

    // Feature modules
    AdminAreaModule
  ],
  exports: [
    BrowserModule
  ],
  declarations: [
    CoreComponent
  ],
  providers: [
    GlobalsService,
    RegexService,
    UtilsService
  ],
  bootstrap: [CoreComponent]
})
export class CoreModule {}

admin-area-router.module.ts:

import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';

// Global modules
import {ComponentsModule, SharedModule} from '../../shared';

// Lazy loaded modules
import {AdminAreaModule} from '../admin-area.module';

@NgModule({
  imports: [
    RouterModule.forChild([
      {
        path: 'admin',
        loadChildren: 'app/+admin-area/admin-area.module#AdminAreaModule'
      }
    ])
  ],
  exports: [
    RouterModule
  ]
})
export class AdminAreaRouterModule {}

管理区域.module.ts:

import {NgModule} from '@angular/core';

import {AdminAreaRouterModule} from './router';

import {ComponentsModule, SharedModule} from '../shared';

@NgModule({
  imports: [
    ComponentsModule,
    SharedModule,

    // Feature modules
    AdminAreaRouterModule
  ],
  exports: [
    ComponentsModule,
    SharedModule,
    AdminAreaRouterModule
  ]
})

export class AdminAreaModule {}

这会引发错误:

Error in ./CoreComponent class CoreComponent - inline template:0:0 caused by: No provider for RouterOutletMap!

当我的 router-outlet 文件中明确包含 router-outlet 时,为什么会出现此错误?

【问题讨论】:

    标签: angular lazy-loading angular2-routing


    【解决方案1】:

    您没有在核心模块中定义路由,但您确实有一个router-outlet

    因此,routeroutletmap (router-outlet) 的错误 no provider (aka no routing is provided)

    即使您的子模块(在本例中为管理模块)中有路由,您也需要将路由添加到核心模块。例如{ path: '', redirectTo: '/admin', pathMatch: 'full' }

    【讨论】:

    • 这只是给了我Maximum callstack exceeded :|
    • 基本上我拥有的是站点的两个部分,一个管理区域和一个普通站点。我希望'/''' 成为正常站点,/admin 成为站点的管理部分。所以我用自己的路由制作了两个模块。我是否在核心模块中延迟加载//admin?然后他们各自的孩子在他们自己的路由文件中?
    • @Chrillewoodz 是的,你会在核心模块中延迟加载 / 和 /admin,相应的子节点应该捆绑在延迟加载的模块中。
    • @Chrillewoodz 我在这里有一个工作示例:github.com/daviddt/angular2-lazy-load-example/tree/master/src 如您所见,我还在根模块中定义了路由。请注意,这是路由 forRoot 而不是路由 forChild
    • 好的,现在开始工作了,我更了解它是如何工作的。非常感谢你救了你一命。
    【解决方案2】:

    这不是路由的工作方式。 loadChildrenadmin 的路由器不应该在admin 里面。它应该在更高的级别,例如core

    因此,当您在core 中导入路由器时,您将获得该模块的所有指令,包括router-outlet

    在此处查看此存储库以了解路由延迟加载的工作原理:
    https://github.com/meligy/routing-angular-cli

    在此 repo 中,app 与您的 core 相似,lazy 与您的 admin 相似。

    AppRoutingModuleAppModuleNgModule imports 中。 AppRoutingModule 的路线如下所示:

    { 路径:'懒惰', loadChildren: './lazy/lazy.module#LazyModule' }

    (是的,您可以相对定义路径,从 beta-17 开始)

    那么,在/lazy 文件夹内,LazyRoutingModuleNgModule importsLazyModule 中。

    LazyRoutingModule 拥有/lazy 内的所有路由。它不知道会是/lazy。只有AppRoutingModule 知道这一点。

    LazyRoutingModule 只知道AppRoutingModule 为它选择的任何路径,LazyRoutingModule 将控制它在该路径下定义的子路由。

    这就是为什么AppRoutingModule 是这样定义的:

    @NgModule({ 进口:[RouterModule.forRoot(routes)], 出口:[路由器模块], 提供者:[] }) 导出类 AppRoutingModule { }

    LazyRoutingModule 定义为:

    @NgModule({ 进口:[RouterModule.forChild(routes)], 出口:[路由器模块], 提供者:[] }) 导出类 LazyRoutingModule { }

    注意forRoot()forChild()

    所有翻译成你的项目的话(同样,app 变成 corelazy 变成 admin,如果我理解你的项目结构正确),你应该能够延迟加载 @987654358 @文件夹。

    告诉我进展如何。

    【讨论】:

    • 很好的答案,我终于设法让它工作了。我不知道的一件事是我可以看到按需加载的块,但只有在我第一次切换到特定视图时。如果我离开然后回来,这些块是否留在内存中或者它实际上是如何工作的?当导航离开时,它不应该再知道延迟加载的模块了吗?
    • 在 Chrome 开发工具中查看网络时,我认为它仍然存在于我的记忆中。
    • 好的。你能看看这个stackoverflow.com/questions/40122820/…吗?
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 2018-03-24
    • 2020-04-04
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多