Angular использует разные макеты для разных маршрутов

У меня проблема с использованием разных макетов в моем угловом приложении. В настоящее время я определил следующие маршруты:

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'

Что я здесь делаю неправильно?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не должны использовать именованные розетки в вашем случае. Именованные розетки необходимы, когда у вас есть несколько розеток на одной странице. Это может быть раздельный макет. В вашем случае каждый компонент присутствует на странице, а другой нет. Поэтому вам нужно использовать маршрутизацию по умолчанию без имен.

Обновление с разбивкой

У вас есть маршруты и подмаршруты. Всякий раз, когда подмаршрут сопоставляется, его родительский маршрут монтируется. Он содержит router-outlet, и поэтому Angular знает, куда смонтировать соответствующий маршрут. Если вы не поместите router-outlet в родительский компонент (например, CmsLayoutComponent), Angular не сможет смонтировать страницу, потому что нет выхода.

С именованными маршрутными выходами это когда у вас есть следующая структура маршрутизации

  • /маршрут
    • /маршрут-А, выходА
    • /маршрут-B, выходB

Ваш компонент на /route может иметь следующую разметку

<router-outlet name = "outletA" />
<router-outlet name = "outletB" />

Тогда вы сможете монтировать и /route-A, и /route-B одновременно.

Логика, описанная ранее, по-прежнему применима. У вас должен быть прямой родитель со всеми указанными выходами.

Ах, я не знал, что angular автоматически выберет правильную розетку маршрутизатора! Спасибо за вашу помощь, это мне очень помогает! Еще вопрос о моей настройке маршрутизации, как мне определить маршруты, если некоторые маршруты используют макет по умолчанию, а некоторые — макет CMS?

A. Vreeswijk 15.04.2023 20:58

Это не Angular выбирает правильный выход. Это то, что у вас есть только одна розетка на странице за один раз. Какой бы подмаршрут ни совпал - компонент монтируется и имеет router-outlet. И Angular присоединяется к нему. Неактивные страницы отсутствуют в DOM

Sergey 16.04.2023 09:57

Другие вопросы по теме