Угловой 4 ленивая загрузка и маршруты не работают
У меня есть модуль с маршрутами моего приложения. Одним из таких маршрутов является модуль ленивой загрузки.
Проблема заключается в том, что этот модуль ленивой загрузки имеет внутри маршрутов для дочерних компонентов. Но в моей конфигурации маршрутизатора эти маршруты не появляются... Поэтому, когда я вызываю ленивый модуль, ничего не показывайте на моем экране.
Вот моя конфигурация маршрутизатора (основной модуль):
export const MODULE_ROUTES: Route[] =[
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
{ path: 'dashboard', component: HomeComponent, canActivate: [AuthGuard] },
{ path: 'calendar', loadChildren: 'app/dashboard/calendar/calendar-module.module#CalendarModuleModule',canActivate: [AuthGuard]},
{ path: '**', component: NoPageFoundComponent, pathMatch: 'full' }
]
.
.
.
@NgModule({
imports: [
RouterModule.forChild(MODULE_ROUTES)
.
.
.
На моем ленивом модуле:
export const MODULE_CALENDAR_ROUTES: Route[] = [
{
path: 'calendar', component: CalendarComponent, canActivateChild: [AuthGuard, CalendarGuard],
children: [
{
path: '', component: MainCalendarComponent, canActivateChild: [AuthGuard, CalendarGuard]
},
{
path: 'user', component: EditEventComponent, canActivateChild: [AuthGuard, CalendarGuard]
}
]
}
]
.
.
.
@NgModule({
imports: [
SharedModule,
.
.
.
RouterModule.forChild(MODULE_CALENDAR_ROUTES)
Если я распечатаю конфигурацию маршрутизатора, этот маршрут declaren на моем ленивом модуле не показать:
Routes: [
{
"path": "dashboard",
"canActivate": [
null
]
},
{
"path": "calendar",
"loadChildren": "app/dashboard/calendar/calendar-module.module#CalendarModuleModule",
"canActivate": [
null
]
},
{
"path": "**",
"pathMatch": "full"
},
{
"path": "dashboard"
}
]
Вы можете мне помочь?
2 ответа:
Проблема была с тем, как я объявил свой маршрут на моем ленивом модуле:
export const MODULE_CALENDAR_ROUTES: Route[] = [ { path: 'calendar', component: CalendarComponent, canActivateChild: [AuthGuard, CalendarGuard], children: [ { path: '', component: MainCalendarComponent, canActivateChild: [AuthGuard, CalendarGuard] }, { path: 'user', component: EditEventComponent, canActivateChild: [AuthGuard, CalendarGuard] } ] } ]
path
изCalendarComponent
должен был измениться из:path: 'calendar', // wrong component: CalendarComponent, ...
К нижеследующему:
path: '', // right component: CalendarComponent, ...
Спасибо @jotatoledo на gitter, которые помогли мне решить эту проблему.
В основном модуле маршрутизации, который вы использовали forChild для загрузки путей, нет никакого корневого маршрутизатора для загрузки дочерних объектов.
@NgModule({ imports: [ RouterModule.forChild(MODULE_ROUTES) ]})
Вместо этого вы должны использовать
@NgModule({ imports: [ RouterModule.forRoot(MODULE_ROUTES) ]})
Еще одна важная вещь должна быть помнить о ленивой загрузке, которую вы должны использовать * * ModuleWithProviders * * основного модуля
EX
Маршрут Lazymodule
import { NgModule, ModuleWithProviders } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [{ path: '', component: ConsumerComponent, children: [{ path: '', component: DashboardComponent }] export const ConsumerRoutingModule: ModuleWithProviders = RouterModule.forChild(routes);
Main_module
@NgModule({ imports: ['ConsumerRoutingModule'] })
Есть интересный блог о ленивой нагрузке : lazyload учебник