#angular #typescript #angular-routing
#angular #typescript #angular-маршрутизация
Вопрос:
Итак, я столкнулся с известной проблемой маршрутизации angular «именованная розетка с лениво загруженным модулем». Похоже, что эта проблема закрыта, и этот парень предоставил plunker с рабочим решением, которому я следил. Однако я все еще получаю сообщение об ошибке и не могу понять природу этой проблемы
Ошибка: не удается сопоставить какие-либо маршруты. Сегмент URL:
Я пытался использовать pathMatch: ‘full’ с разными маршрутами перенаправления на разные компоненты, но в итоге всегда получал одну и ту же ошибку.
Я застрял уже на пару часов, поэтому решил задать вопрос здесь. В чем моя проблема и чего мне не хватает?
Моя настройка
app.routing.ts:
const routes: Routes = [
{
path: '',
loadChildren: 'app/home/home.module#HomeModule',
},
{
path: 'admin',
loadChildren: 'app/admin/admin.module#AdminModule',
},
{
path: 'data',
loadChildren: 'app/data/data.module#DataModule',
},
{
path: '**',
redirectTo: ''
}
];
app.component.html
<app-header></app-header>
<router-outlet></router-outlet>
data.routing-module.ts
const routes: Routes = [
{
path: 'summary',
component: SummaryComponent,
canActivate: [AuthGuard],
},
{
path: 'management/:id',
component: DataComponent,
canActivate: [AuthGuard],
children: [
{
path: 'activities',
component: ActivitiesComponent,
outlet: 'activities',
},
{
path: 'researches',
component: ResearchesComponent,
outlet: 'researches',
}
]
},
{
path: 'review/:id',
component: InfoComponent,
canActivate: [AuthGuard],
},
];
data.component.html
<mat-drawer-container class="docs-viewer-container">
<mat-drawer position='start' [mode]='mode'>
<router-outlet name="activities"></router-outlet>
</mat-drawer>
<mat-drawer position='end' [mode]='mode'>
<router-outlet name="researches"></router-outlet>
</mat-drawer>
<mat-drawer-content>
...
// content
...
</mat-drawer-content>
</mat-drawer-container>
Итак, целевая страница для модуля данных является компонентом сводки после того, как пользователь нажал ссылку для навигации по URL-маршруту, выглядит так: 'path/data/summary?params'
. Резюме. компонент имеет функцию навигации
onActivitySelection(event) {
this.queryParams.offset = 0;
this.queryParams.limit = 25
this.router.navigate([{
outlets: {
'activities': '/data/management/' event.id '/activities'
}
}],
{
queryParams: this.queryParams
})
}
Как вы можете видеть, маршрут перенаправления должен быть ‘/data /management /:id / activities’. Но ошибка говорит о том, что этот маршрут не может быть найден.
Итак, кто-нибудь может помочь мне с моей проблемой?
Ответ №1:
Попробуйте разместить маршруты модуля в компоненте индекса. У вас есть маршрутизатор-выход для модуля приложения, но не для любого из нижележащих уровней.
Для маршрутов модуля данных:
{
path: '', component: DataIndexComponent, canActivate: [AuthGuard],
children: [
{
path: 'summary',
component: SummaryComponent
},
...[restOfRoutes]
]
}
В DataIndexComponent add <router-outlet></router-outlet>
.
С другой стороны, если вы используете ту же защиту аутентификации, вы можете поместить ее на уровень индекса модуля.
Комментарии:
1. Непосредственно перед вашим комментарием я попытался применить аналогичное решение, и оно работает частично. IndexComponent.html :
<router-outlet></router-outlet> <router-outlet name="activities"></router-outlet>
Поэтому, если я вручную укажу URL, angular перенаправит меня на необходимый маршрут, но он не работает, если я попытаюсь перейти с помощью функцииonActivitySelection(event)
. Кажется, что-то не так…2. Я лично не стал бы размещать router-outlet под основным, поскольку вы хотите добавить остальные маршруты после ‘data’ в соответствии с деревом URL, не имея дочернего router-outlet рядом с App router-outlet. Попробуйте
this.router.navigate([`/data/management/${eventId}/activities`])
. (PS Я не думаю, что есть необходимость явно указывать выходы дочерних маршрутов, если вы не собираетесь добавлять дочерние элементы под ним.)3. … или, если вы будете следовать шаблону вложенности выходов маршрутизатора.
4. Я заменил имя розетки на дочерний компонент, потому что это кажется правильным, но
this.router.navigate([
/data /management/${EventID}/activities])
5. Я не думаю, что вы закончили свой комментарий. Похоже, вы не добавили обратные пометки к аргументу в массиве. Покажите мне замену или вы можете поместить ее в Stackblitz.