Angular2路由器:如何使用自己的路由规则正确加载子模块

sma*_*use 33 url-routing nested-routes angular2-routing angular2-modules angular

这是我的Angular2应用程序结构:

在此输入图像描述

这是我的代码的一部分.以下是moduleAngular2应用程序的主要内容,它导入其路由规则和子模块(EdgeModule)并使用与某些页面相关的一些组件.

app.module.ts

@NgModule({
    declarations: [
        AppComponent,
        PageNotFoundComponent,
        LoginComponent
    ],
    imports: [
        ...
        appRouting,
        EdgeModule
    ],
    providers: [
        appRoutingProviders,
        LoginService
    ],
    bootstrap: [AppComponent]
})

export class AppModule {
}
Run Code Online (Sandbox Code Playgroud)

以下是主模块的路由规则.它有登录页面和页面找不到的路径.

app.routing.ts

const appRoutes: Routes = [
    { path: 'login', component: LoginComponent },
    { path: '**', component: PageNotFoundComponent }
];

export const appRoutingProviders: any[] = [];

export const appRouting = RouterModule.forRoot(appRoutes, { useHash: true });
Run Code Online (Sandbox Code Playgroud)

这是EdgeModule声明它使用的组件并导入自己的路由规则和2个子模块(FirstSectionModuleSecondSectionModule).

edge.module.ts

@NgModule({
    declarations: [
        EdgeComponent,
        SidebarComponent,
        TopbarComponent
    ],
    imports: [
        ...
        edgeRouting,
        FirstSectionModule,
        SecondSectionModule
    ],
    providers: [
        AuthGuard
    ]
})

export class EdgeModule {
}
Run Code Online (Sandbox Code Playgroud)

以下是加载模块的路由规则,如您所见,顶部栏和侧边栏组件.

edge.routing.ts

Paths['edgePaths'] = {
    firstSection: 'firstSection',
    secondSection: 'secondSection'
};

const appRoutes: Routes = [
    { path: '', component: EdgeComponent,
        canActivate: [AuthGuard],
        children: [
            { path: Paths.edgePaths.firstSection, loadChildren: '../somepath/first-section.module#FirstModule' },
            { path: Paths.edgePaths.secondSection, loadChildren: '../someotherpath/second-section.module#SecondModule' },
            { path: '', redirectTo: edgePaths.dashboard, pathMatch: 'full' }
        ]
    }
];

export const edgeRouting = RouterModule.forChild(appRoutes);
Run Code Online (Sandbox Code Playgroud)

最后,这是两个子模块之一,它有其组件并导入其路由规则.

第一section.module.ts

@NgModule({
    declarations: [
        FirstSectionComponent,
        SomeComponent
    ],
    imports: [
        ...
        firstSectionRouting
    ],
    providers: [
        AuthGuard,
    ]
})

export class FirstSectionModule {
}
Run Code Online (Sandbox Code Playgroud)

这些是页面(组件)的路由规则 FirstSectionModule

第一section.routing.ts

Paths['firstSectionPaths'] = {
    someSubPage: 'some-sub-page',
    someOtherSubPage: 'some-other-sub-page'
};

const appRoutes: Routes = [
    {
        path: '',
        children: [
            { path: Paths.firstSectionPaths.someSubPage, component: someSubPageComponent},
            { path: Paths.firstSectionPaths.someOtherSubPage, component: someOtherSubPageComponent},
            { path: '', component: AnagraficheComponent }
        ]
    }
];

export const firstSectionRouting = RouterModule.forChild(appRoutes);
Run Code Online (Sandbox Code Playgroud)

second-section.module.tssecond-section.routing.ts文件几乎一样.

当我运行应用程序时,首先加载的是与页面相关的内容FirstSectionComponent,没有侧栏或顶栏.

你能告诉我我的代码有什么问题吗?控制台中没有错误.

Yas*_*ata 8

您可以使用loadChildren尝试此操作,其中homeModule,productMoudle,aboutModule有自己的路由规则.

const routes: Routes = [
    { path: 'home', loadChildren: 'app/areas/home/home.module#homeModule' },
    { path: 'product', loadChildren: 'app/areas/product/product.module#ProductModule' },
    { path: 'drawing', loadChildren: 'app/areas/about/about.module#AboutModule' }
];

export const appRouting = RouterModule.forRoot(routes);
Run Code Online (Sandbox Code Playgroud)

家庭路线规则就像

export const RouteConfig: Routes = [
    {
        path: '',
        component: HomeComponent,
        canActivate: [AuthGuard],
        children: [
            { path: '', component: HomePage },
            { path: 'test/:id', component: Testinfo},
            { path: 'test2/:id', component: Testinfo1},
            { path: 'test3/:id', component: Testinfo2}
        ]
    }
];
Run Code Online (Sandbox Code Playgroud)

这也称为延迟加载模块.

{ path: 'lazy', loadChildren: 'lazy/lazy.module#LazyModule' }
Run Code Online (Sandbox Code Playgroud)

这里有一些重要的事情需要注意:我们使用属性loadChildren而不是component.我们传递一个字符串而不是一个符号,以避免急切地加载模块.我们不仅定义了模块的路径,还定义了类的名称.LazyModule没有什么特别的,除了它有自己的路由和一个名为LazyComponent的组件.

查看这个与此相关的精彩教程.

https://angular-2-training-book.rangle.io/handout/modules/lazy-loading-module.html


小智 0

不确定我是否正确地解决了问题,但这里有一个小代码片段,我用它来动态生成路由:

应用程序组件.ts:

constructor(private _router: Router) {
}

ngOnInit() {
     ...
     this._router.config[0].children = myService.getRoutes(); 
     this._router.resetConfig(this._router.config);
     console.debug('Routes:', this._router.config);
     ...
}
Run Code Online (Sandbox Code Playgroud)

这不是 OOTB 解决方案,但您可以获得有关当前路线的信息。