如何仅在急切加载时将路由添加到Angular模块

时间:2019-02-05 07:24:52

标签: angular angular-routing

我有一个包含一些路由的模块:

export const routes: Routes = [
    {
        path: '/some-util-path',
        component: SomeUtilComponent
    }
];

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        RouterModule.forRoot(routes)
    ],
    declarations: [
        // --- some components ---
    ],
    providers: [
        // --- some services ---
    ],
    exports: [
        // --- some exports ---
    ],
})
export class MyUtilModule {

}

当我在app.module(根模块)中导入此模块时,此方法工作正常,但是当我(同样)在延迟加载的模块中导入时,我得到

Error: RouterModule.forRoot() called twice. 
Lazy loaded modules should use RouterModule.forChild() instead.

如何配置此实用程序模块以根据其用例将路由加载为forRoot和forChild?

我想我可以将路由和“ SomeUtilComponent”拆分到另一个仅在app.module中加载的模块,但是我有兴趣知道是否仅使用一个模块和条件逻辑就可以。

我正在阅读静态的forRoot和forChild方法,但是我不知道如何安排导入,因为您只能指定提供程序。

1 个答案:

答案 0 :(得分:0)

您好,我认为您需要export const routing: ModuleWithProviders = RouterModule.forChild(routes);才能使此处的路由有效,这是一个示例:

const routes: Routes = [{ path: '', component: LazyComponent }];
export const routing: ModuleWithProviders = RouterModule.forChild(routes);

,然后在您的延迟加载模块中执行下一步:

@NgModule({
  imports: [routing],
  declarations: [LazyComponent]
})
export class LazyModule {}

这是一篇文章: Lazy Loading a Module

来自Angular IO concerning lazy loading

  

您可能已经注意到CLI将RouterModule.forRoot(routes)添加到app-routing.module.ts导入数组中。这使Angular知道该模块AppRoutingModule是路由模块,而forRoot()指定这是根路由模块。它配置您传递给它的所有路由,使您可以访问路由器指令,并注册RouterService。在AppRoutingModule中使用forRoot(),即在根级别在应用程序中使用一次。   CLI还将RouterModule.forChild(routes)添加到功能路由模块。这样,Angular知道路由列表仅负责提供其他路由,并且用于功能模块。您可以在多个模块中使用forChild()。