Angular 2 - маршрутизація підмодуля та вкладений <router-outlet>


82

Я шукаю рішення з Angular 2 для сценарію, описаного нижче:

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

У цьому сценарії верхня панель навігації містить посилання для завантаження підмодулів, а навігаційна панель - посилання для оновлення вмісту підмодуля.

URL-адреси мають відображатись як:

  • / home => завантажує домашню сторінку в розетку основного компонентного маршрутизатора
  • / submodule => завантажує підмодуль в розетку основного компонентного маршрутизатора і за замовчуванням повинен відображати домашню сторінку та підвкладку панелі підмодуля
  • / submodule / feature => завантажує функцію всередині розетки маршрутизатора субмодуля

Модуль програми (і компонент програми) містить верхню панель навігації для переходу до різних підмодулів, і шаблон компонента програми може виглядати так

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Але тут є складність. Мені потрібно, щоб мої підмодулі мали подібний макет із панеллю навігації другого рівня та власною розеткою маршрутизатора для завантаження власних компонентів.

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

Я спробував усі варіанти і шукав скрізь, але не міг знайти рішення, щоб мати шаблон за замовчуванням (наприклад, компонент програми) у підмодулі з розеткою маршрутизатора, а також завантажити вміст підмодуля у внутрішню розетку маршрутизатора, не втрачаючи піднав. .

Буду вдячний за будь-який внесок чи ідеї


То що саме відбувається з поточною установкою?
мікроніки

1
при поточній установці я не можу використовувати внутрішню розетку маршрутизатора. Маршрутизація завантажує навіть компоненти підмодуля в основну розетку маршрутизатора, і всі мої шаблони компонентів підмодуля повинні мати включений під-модуль
Ron F

1
Ви знайшли рішення для вкладеного маршрутизатора-розетки, не втрачаючи піднавігацію? Я потрапив у подібне питання.
Saurav

2
Так, я думаю, що я зіткнувся з тим самим, <sub-navbar> просто не відображається, лише те, що виходить з маршрутизатора.
louisvno

Перевірте тут приклад багаторівневого RouterOutlet та RouterModules Angular 8 freakyjolly.com/…
Code Spy

Відповіді:


54

Сторінка html буде виглядати так.

Головна сторінка

<top-navbar></top-navbar>
<router-outlet></router-outlet>

Сторінка підмодуля

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>

після натискання навігації на верхній панелі навігації головний вихід маршруту буде прокладати маршрут відповідно.

при натисканні на панель навігації розетка маршрутизатора [sub] прокладе маршрут відповідно.

HTML чудово, фокус буде при написанні app.routing

app.routing.ts

const appRoutes: Routes = [
  {
    path: 'login',
    component: LoginComponent
  },
  { path: 'home',
    component: homeComponent,
    children: [
      {
        path: 'module1',
        component: module1Component,
        children: [
          {
            path: 'submodule11',
            component: submodule11Component,
          },
          {
            path: '',
            redirectTo: 'submodule11',
            pathMatch: 'full'
          }
        ]
      },
      {
        path: 'module2',
        component: module2omponent,
        children: [
          {
            path: 'submodule21',
            component: submodule21Component,
          },
          {
            path: '',
            redirectTo: 'submodule21',
            pathMatch: 'full'
          }
        ]
      }
    ]
  },
  {
    path: 'about',
    component: aboutComponent
  }
]

Сподіваюся, це допоможе вам.

Детальніше https://angular.io/guide/router


1
Так, ваш html str був правильним, головна гра - це app.routing.ts. Я робив подібні програми два рази.
Aswin KV

1
Дякую за відповідь. Я спробував аналогічну маршрутизацію, але моя плутанина полягає в тому, куди повинна йти ця розетка для підмодуля? для основного модуля зрозуміло, що розетка маршрутизатора повинна бути в шаблоні app.component, але ми не маємо однакової концепції компонента програми для підмодулів. так куди йде розетка "допоміжного" маршрутизатора?
Ron F

Також як повинен виглядати routerLink на панелі навігації?
Рон Ф,

3
Посилання маршрутизатора повинно бути рядком, якщо ви додасте '/' на початку рядка, воно замінить поточний маршрут, якщо ви не додасте '/' посилання маршруту додасть поточний маршрут. Проте ви незрозумілі, створіть зразок програми на якій-небудь платформі кодування в Інтернеті та поділіться посиланням
Aswin KV

2
Я не впевнений у цьому, але вкладену router-outletдирективу не потрібно називати. Ось приклад: github.com/gothinkster/angular-realworld-example-app/blob/…
Джес

21

Використання:

RouterModule.forChild()
...
<router-outlet name="sub"></router-outlet>
...
[routerLink]="[{ outlets: { sub: [subRouteName] } }]"

Повний приклад:

HTML

<div class="tabs tinyscroll">
  <button *ngFor="let tab of tabs"
  [routerLink]="[{ outlets: { sub: [tab.name] } }]"
  routerLinkActive="selected">
    <span>{{ tab.label }}</span>
  </button>
</div>

<section>
  <router-outlet name="sub"></router-outlet>
</section>

app.module.ts

imports: [
...
    RouterModule.forChild([
      {
        path: 'registers',
        component: RegistersComponent,
        children: [
          {path: 'vehicles', component: VehiclesComponent, outlet: 'sub'},
          {path: 'drivers', component: DriversComponent, outlet: 'sub'},
          {path: 'bases', component: BasesComponent, outlet: 'sub'},
          {path: 'lines', component: LinesComponent, outlet: 'sub'},
          {path: 'users', component: UsersComponent, outlet: 'sub'},
          {path: 'config', component: ConfigComponent, outlet: 'sub'},
          {path: 'companies', component: CompaniesComponent, outlet: 'sub'}
        ],
        canActivate: [AuthGuard]
      }
    ]),
...

1
Яка версія після цього іменного маршруту підтримується. Bcoz Я намагаюся у v6, і він не працює.
Суджай ООН

1
У поточній версії angular це не працює.
After_Sunset

0

Ви повинні згадати назву розетки в маршрутах, згадайте назву розетки вашого маршрутизатора в маршруті, як це "outlet: 'sub"

routes: Routes = [
  {path:'', redirectTo: 'login', pathMatch: 'full'},
  {
    path: 'login',
    component: LoginComponent,

  },
  { path: 'home',
    component: AppComponent,
      children: [
        {path: 'home/pdf',component: SideMenuPage,outlet:"sub" },
        {path:'home/addFileUp',component:SidePageAdd,outlet:"sub"},
      ]
   },
];

цей фрагмент повертає помилку: "Uncaught ReferenceError: LoginComponent не визначений"
Umpa,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.