Навигация в именованной розетке в Angular не работает. Почему?

Навигация в именованной розетке в Angular не работает. Почему?

Вот ошибка:

введите здесь описание изображения

NavigationStart(id: 3, url: '/(sidebar-outlet:login/(sidebar-outlet:account-creation)//header-info-outlet:empty)')
...
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'login'
Error: Cannot match any routes. URL Segment: 'login'
    at ApplyRedirects.noMatchError (router.js:4396)

Вот мои настройки маршрутов:

const routes: Routes = [
  { path: "empty", component: EmptyComponent },
  { path: "", component: HomeComponent },

  { path: "empty", component: EmptyComponent, outlet: Outlets.sidebar },
  { path: "login", component: LoginComponent, outlet: Outlets.sidebar },
  {
    path: "account-creation",
    component: CreateAccountComponent,
    outlet: Outlets.sidebar
  },
  { path: "menu", component: MainMenuComponent, outlet: Outlets.sidebar },

  { path: "empty", component: EmptyComponent, outlet: Outlets.headerInfo },
  {
    path: "header-info",
    component: HeaderInfoComponent,
    outlet: Outlets.headerInfo
  }
];

Вот Outlets:

export const Outlets = {
  sidebar: "sidebar-outlet",
  headerInfo: "header-info-outlet"
};

Вот routerLink, при нажатии на который возникает ошибка:

[routerLink]= "[{ outlets: { 'sidebar-outlet': ['account-creation']}}]"

Вот предпоследнее состояние роутера:

/(sidebar-outlet:login//header-info-outlet:empty)

Вот ожидаемое конечное состояние маршрутизатора в случае, если ошибка будет исправлена:

/(sidebar-outlet:account-creation//header-info-outlet:empty)

Я очень смущен, и после двух дней поиска ответа я не смог его найти. По такому routerLink (особенно 'sidebar-outlet': ['account-creation']) я ожидаю, что маршрут после клика будет /(sidebar-outlet:account-creation//header-info-outlet:empty), но он пытается стать /(sidebar-outlet:login/(sidebar-outlet:account-creation)//header-info-outlet:empty), как мы видим в ошибке.

Как я могу это исправить?

ОБНОВЛЕНИЕ

Вот мой app.component.html (только показанная ниже часть содержит router-outlet, в шаблонах моего проекта нет других мест, где я бы использовал router-outlet):

<link
  href="https://fonts.googleapis.com/icon?family=Material+Icons&display=block"
  rel="stylesheet"
/>

<div class="mat-app-background">
  <mat-toolbar class="main-toolbar" color="primary">>
    <router-outlet name="header-info-outlet"></router-outlet>
  </mat-toolbar>

  <mat-sidenav-container>
    <mat-sidenav #sidenav 
      position="end" 
      mode="over"
      class="sidebar-container">
      <router-outlet name="sidebar-outlet"></router-outlet>
    </mat-sidenav>

    <mat-sidenav-content>
      <router-outlet></router-outlet>
      <app-footer></app-footer>
    </mat-sidenav-content>
  </mat-sidenav-container>
</div>

person manymanymore    schedule 22.05.2020    source источник
comment
Можете показать html? С этими розетками....   -  person JWP    schedule 23.05.2020
comment
@JohnPeters, только что добавил. (у)   -  person manymanymore    schedule 24.05.2020
comment
Я никогда не видел такой сложной маршрутизации. есть ли причина, по которой вы не используете простую маршрутизацию? обычно маршрутизация выглядит так: [routerLink]="['/login']"   -  person Rick    schedule 24.05.2020
comment
@ Рик, я не уверен, что ты понимаешь, что я пытаюсь реализовать. У меня есть несколько независимых представлений в моем приложении. Представления представлены разными router-outlet`ами. Я хотел бы, чтобы навигация в представлениях была независимой друг от друга. Итак, маршрут /login подходит для выхода без названия. Но проблема, описанная в вопросе, касается исключительно навигации по именованным выходам. И в таком случае навигация к /login не влияет на какой-либо именованный выход, и это сбивает меня с толку. Не могли бы вы уточнить, пожалуйста?   -  person manymanymore    schedule 24.05.2020


Ответы (2)


Это может сработать для вас. Создайте новый компонент с именем sideNavContainer. Затем создайте еще один с именем sideNavComponent и еще один SidNav2Component, разбейте html, чтобы контейнер содержал оба sideNavs. Создайте маршрут к контейнеру, затем добавьте 2 дочерних маршрута, указывающих на другие.

Добавьте контейнер в панель инструментов. Любая навигация к дочерним элементам должна обновлять дочерние элементы, не затрагивая ничего остального.

person JWP    schedule 24.05.2020
comment
Ok. Я очень благодарен за вашу помощь. После прочтения документации я уверен, что смогу реализовать реализацию в как вы это описали. Итак, я приму ваш ответ. :) - person manymanymore; 24.05.2020
comment
Ой. Одна очень серьезная проблема с вложенными маршрутами заключается в том, что я полностью теряю независимость. Я смогу использовать дочерние маршруты в случае фиксированного родительского маршрута. Это определенно не то, что я искал. Не могли бы вы проконсультировать меня по этой части? - person manymanymore; 24.05.2020
comment
Я не понимаю вашей точки зрения. Мне жаль. Не могли бы вы уточнить это, пожалуйста? - person manymanymore; 24.05.2020
comment
этот вопрос помог понять ваш ответ. Спасибо. :) - person manymanymore; 24.05.2020

Включает ли ваш шаблон безымянный маршрутизатор-выход? Недавно я столкнулся с теми же проблемами, и для меня это сработало, так как я просто добавил маршрутизатор по умолчанию в свой компонент приложения.

person jaxX171    schedule 22.05.2020
comment
Да, это так. Я использую розетку маршрутизатора по умолчанию в качестве основной розетки. Я очень благодарен за ваше время и внимание. Но я не уверен, что ваш ответ решит мою проблему. Не могли бы вы проверить это, пожалуйста, или подробнее по этому вопросу? - person manymanymore; 23.05.2020
comment
У меня есть безымянный router-outlet, и он мне нужен для разных целей. В моем случае это основной вид, в то время как у меня есть разные выходы для заголовка и боковой панели. - person manymanymore; 23.05.2020