У меня проблема с использованием разных макетов в моем угловом приложении. В настоящее время я определил следующие маршруты:
const routes: Routes = [
{
path: '',
component: DefaultLayoutComponent,
children: [
{ path: '', component: LandingPageComponent, outlet: 'default' },
{ path: 'login', component: LoginRegisterComponent, outlet: 'default' },
{ path: 'register', component: LoginRegisterComponent, outlet: 'default' },
]
},
{
path: 'companies',
component: CmsLayoutComponent,
children: [
{ path: '', component: CompanyIndexComponent, outlet: 'cms' },
{ path: ':id', component: CompanyViewComponent, outlet: 'cms' },
]
},
];
Теперь я пытаюсь добиться макета по умолчанию, который является DefaultLayoutComponent
Внутри этого компонента я определил некоторые стили и:
<router-outlet name = "default"></router-outlet>
Я сделал то же самое для CmsLayoutComponent с помощью:
<router-outlet name = "cms"></router-outlet>
Целевая страница загружается успешно, но когда я пытаюсь перейти, например, к /login, меня перенаправляют обратно на корневой маршрут с CmsLayoutComponent, но без какого-либо другого компонента, загруженного в выход маршрутизатора. Моя консоль печатает:
core.mjs:8416 ERROR Error: Uncaught (in promise): Error: NG04002: Cannot match any routes. URL Segment: 'login'
Error: NG04002: Cannot match any routes. URL Segment: 'login'
Что я здесь делаю неправильно?
Вы не должны использовать именованные розетки в вашем случае. Именованные розетки необходимы, когда у вас есть несколько розеток на одной странице. Это может быть раздельный макет. В вашем случае каждый компонент присутствует на странице, а другой нет. Поэтому вам нужно использовать маршрутизацию по умолчанию без имен.
Обновление с разбивкой
У вас есть маршруты и подмаршруты. Всякий раз, когда подмаршрут сопоставляется, его родительский маршрут монтируется. Он содержит router-outlet
, и поэтому Angular знает, куда смонтировать соответствующий маршрут. Если вы не поместите router-outlet
в родительский компонент (например, CmsLayoutComponent), Angular не сможет смонтировать страницу, потому что нет выхода.
С именованными маршрутными выходами это когда у вас есть следующая структура маршрутизации
Ваш компонент на /route
может иметь следующую разметку
<router-outlet name = "outletA" />
<router-outlet name = "outletB" />
Тогда вы сможете монтировать и /route-A
, и /route-B
одновременно.
Логика, описанная ранее, по-прежнему применима. У вас должен быть прямой родитель со всеми указанными выходами.
Это не Angular выбирает правильный выход. Это то, что у вас есть только одна розетка на странице за один раз. Какой бы подмаршрут ни совпал - компонент монтируется и имеет router-outlet
. И Angular присоединяется к нему. Неактивные страницы отсутствуют в DOM
Ах, я не знал, что angular автоматически выберет правильную розетку маршрутизатора! Спасибо за вашу помощь, это мне очень помогает! Еще вопрос о моей настройке маршрутизации, как мне определить маршруты, если некоторые маршруты используют макет по умолчанию, а некоторые — макет CMS?