看看你所有的路线。
appRoutes = [ // AppModule
{ path: '', redirectTo: 'dashaboard' },
{ path: 'dashboard', component: DashboardComponent
];
benutzerRoutes = [ // BenutzerModule
{ path: 'benutzer/:id', component BenutzerComponent }
];
klientRoutes = [ // KlinetModule
{ path: 'klient/:id', component: KlientComponent }
]
您导入模块的方式对构建路由没有任何影响。它们是如何构建的,只是基于我们如何构建这些。要使用此
AppModule
imports -> BenutzerModule
imports -> KlinetModule
期待什么导致以下途径
dashboard/benutzer/:id/klient/:id
只是并非如此。这些路由数组中的每一个都被简单地添加到根。这就是为什么你可以访问klient/:id
而不是dashboard/benutzer/:id
。
我已经阅读了几次路由的完整文档,并且在不同模块中没有任何嵌套路由的示例。所有示例都具有从根路由加载的模块,就像您的示例那样,或者嵌套路由是相同路由配置的一部分。所以既然没有例子,我想我们只需要了解我们所知道的事情,并自己决定什么是最好的方法。
有几种方法我可以想到。首先,最明显的,但IMO比下一个选项更具侵入性,是刚刚满路由添加到路径
appRoutes = [ // AppModule
{ path: '', redirectTo: 'dashaboard' },
{ path: 'dashboard', component: DashboardComponent
];
benutzerRoutes = [ // BenutzerModule
{ path: 'dashboard/benutzer/:id', component BenutzerComponent }
];
klientRoutes = [ // KlinetModule
{ path: 'dashboard/benutzer/:id/klient/:id', component: KlientComponent }
]
我说这个选项是更具侵入性,因为它迫使孩子们了解父母。在Angular 2架构中,与我们如何构建组件的方式相反。父母应该了解孩子,但不一定相反。
我能想到的另一种选择是使用loadChildren
懒惰地加载子模块。我说“懒惰”,因为我无法弄清楚如何急切地这样做,而不确定是否甚至有可能这样做。懒洋洋地加载的孩子,我们可以做
export const appRoutes: Routes = [
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: DashboardComponent },
{
path: 'dashboard/benutzer',
loadChildren: 'app/benutzer/benutzer.module#BenutzerModule'
},
{ path: '**', component: NotFoundComponent }
];
export const benutzerRoutes: Routes = [
{ path: ':id', component: BenutzerComponent },
{
path: ':id/klient',
loadChildren: 'app/klienten/klienten.module#KlientenModule'
}
];
export const klientenRoutes: Routes = [
{ path: ':id', component: KlientComponent }
];
在这种情况下,我们会从他们的父母@NgModule
删除所有的子模块导入。这允许延迟加载模块。如果我们离开了,那么模块会在启动时急切地加载,但不会产生预期的效果(因此我为什么说我不是如何热切地这样做)。
另请注意loadChildren
。在上面的例子中,我使用app
作为根。唯一的原因是我在当地环境中进行了测试。我不是Plunker的忠实粉丝。尽管如此,你应该使用src
作为根。
IMO,延迟加载看起来清洁剂,因为孩子不知道父母,但是这力量你懒洋洋地加载模块,这可能是不期望的。但在某些情况下,这是所希望的,因为它允许较轻的初始负载。
更多关于延迟加载,请参阅该文档上Asynchronous Routing
的确,有很多文档,这个真实世界的场景根本没有处理。实际上,他们暗示嵌套的模块/路线,但他们从来没有拿出一个例子,所以我猜测他们只是略过了这个功能的最后。 –
标记为答案,因为使用延迟加载的替代解决方案,这是我最终解决的问题。 –
我也挑选了第二个解决方案,但它让我感到厌烦,这样一个简单的事情还没有实现。 – Mikki