【问题标题】:Angular 2 - Submodule routing and nested <router-outlet>Angular 2 - 子模块路由和嵌套 <router-outlet>
【发布时间】:2017-06-11 00:06:15
【问题描述】:

我正在为下面解释的场景寻找 Angular 2 的解决方案:

在这种情况下,顶部导航包含加载子模块的链接,子导航包含更新子模块内容的链接。

网址应映射为:

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

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

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

但这就是复杂性。我需要我的子模块具有类似的布局,带有二级导航栏和它们自己的路由器出口来加载它们自己的组件。

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

我尝试了每个选项并到处搜索,但找不到在带有路由器插座的子模块中拥有默认模板(如应用程序组件)的解决方案,并且还在内部路由器插座中加载子模块的内容而不会丢失子导航。

如果有任何意见或想法,我将不胜感激

【问题讨论】:

  • 那么当前设置到底发生了什么?
  • 在当前设置下,我无法使用内部路由器插座。路由甚至在主路由器出口中加载子模块组件,我所有的子模块组件模板都必须包含子导航
  • 您是否找到了解决嵌套路由器插座而又不丢失子导航的方法?我遇到了类似的问题。
  • 是的,我想我遇到了同样的问题, 只是不显示,只有路由器出口的内容。

标签: angular routes


【解决方案1】:

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

【讨论】:

  • 是的,你的 html str 是正确的,主要的游戏是 app.routing.ts 我做过两次类似的应用程序。
  • 感谢您的回答。我尝试了类似的路由,但我的困惑是该子模块路由器出口应该去哪里?在主模块上,很明显路由器出口应该在 app.component 的模板中,但我们对子模块没有相同的 app 组件概念。那么“子”路由器插座在哪里?
  • 还有子导航栏中的routerLink应该是什么样子的?
  • 路由器链接必须是字符串,如果在字符串开头添加'/',它将替换当前路由,如果不添加'/',则路由链接将添加当前路由。还是不清楚,请在某个在线编码平台上创建一个示例应用程序并分享链接
  • 我对此并不完全确定,但嵌套的router-outlet 指令不需要命名。这是一个例子:github.com/gothinkster/angular-realworld-example-app/blob/…
【解决方案2】:

用途:

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]
      }
    ]),
...

【讨论】:

  • 支持此名称路由的哪个版本。 Bcoz 我正在尝试使用 v6,但它无法正常工作。
  • 这在当前版本的 angular 中不起作用。
  • 在角度 12 处为我工作
【解决方案3】:

您必须在路线中提及出口名称 在路由中提及您的路由器插座名称,例如“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"},
      ]
   },
];

【讨论】:

  • 这个 sn-p 返回错误:“未捕获的 ReferenceError: LoginComponent is not defined”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2019-08-04
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多