Angular 2 - 子模块路由和嵌套<router-outlet>

Ron*_*n F 67 routing angular

我正在寻找一个Angular 2的解决方案,用于下面解释的场景:

在此输入图像描述

在这种情况下,top-nav包含加载子模块的链接,sub-nav有链接来更新子模块的内容.

网址应映射为:

  • / home =>在主组件路由器插座中加载主页
  • / submodule =>加载主组件路由器插座中的子模块,默认情况下应显示子模块的主页和子导航栏
  • / submodule/feature =>加载子模块路由器插座内的功能

应用程序模块(和应用程序组件)包含一个导航到不同子模块的顶部导航栏,应用程序组件模板可能如下所示

<top-navbar></top-navbar>
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)

但这是复杂性.我需要我的子模块与第二级导航栏和他们自己的路由器插座具有相似的布局,以加载他们自己的组件.

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>
Run Code Online (Sandbox Code Playgroud)

我尝试了所有选项并在任何地方搜索但是找不到具有路由器插座的子模块中的默认模板(如app组件)的解决方案,并且还在内部路由器插座中加载子模块的内容而不会丢失子导航.

我会很感激任何意见或想法

Asw*_* KV 43

html页面看起来像这样.

主页

<top-navbar></top-navbar>
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)

子模块页面

<sub-navbar></sub-navbar>
<router-outlet name='sub'></router-outlet>
Run Code Online (Sandbox Code Playgroud)

点击顶部导航栏中的导航,主要路径出口将分别路由.

点击子导航栏时,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
  }
]
Run Code Online (Sandbox Code Playgroud)

希望它会对你有所帮助.

更多细节https://angular.io/guide/router

  • 路由器链接必须是一个字符串,如果你在字符串的开头添加'/'它将替换当前路由如果你不添加'/'路由链接将添加当前路由.你还不清楚请在一些在线编码平台上创建一个示例应用程序并分享链接 (3认同)
  • 感谢你的回答。我尝试了类似的路由,但我的困惑是子模块路由器出口应该去哪里?在主模块上,很明显,路由器出口应该位于 app.component 的模板中,但我们对于子模块没有相同的应用程序组件概念。那么“子”路由器插座去哪里了? (2认同)
  • 我对此并不完全确定,但不需要命名嵌套的 `router-outlet` 指令。这是一个例子:https://github.com/gothinkster/angular-realworld-example-app/blob/63f5cd879b5e1519abfb8307727c37ff7b890d92/src/app/profile/profile.component.html (2认同)

小智 16

使用:

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

完整示例:

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>
Run Code Online (Sandbox Code Playgroud)

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]
      }
    ]),
...
Run Code Online (Sandbox Code Playgroud)