Angular 2:让子路由组件替换路由器插座中的Parent

Joh*_*ohn 22 angular

有没有办法在父路线中显示子路线<router-outlet>

例如,假设我们有两条路线:

/users/12345

/users/12345/orders/12345
Run Code Online (Sandbox Code Playgroud)

我还需要第二次是第一个孩子,但我也需要完全替代的内容/users/12345一致的内容/users/12345/orders/12345不是让/users/12345/orders/12345/users/12345router-outlet.

我以为我可以通过命名父级路由器来实现这一点,并且两条路由都以它为目标,但是从我一直在做的研究(以及它引起的错误)我感觉这些名称是用于二次使用时已经存在一个主路由器插座

N. *_*ain 16

我遇到过同样的问题.这就是我修复它的方法:

const routes: Routes = [
   {
    path: '',
    children: [
         {
           path: '',
           component: ParentComponent,
         },
         {
           path: 'child',
           component: ChildComponent,
         }
     ]
   }
];  
Run Code Online (Sandbox Code Playgroud)

  • 我有相同的结构,但有一个问题。父组件路由实际上是子路由的兄弟。例如,如果您需要为父组件解析一些数据,但又将其传递给子组件,则会出现问题。 (3认同)
  • 如果你有一个子路由模块怎么办? (2认同)

You*_*esM 13

您可以通过设置这样的路线来实现:

const routes : Routes = [
  { 
    path : 'user/:id',
    component : ParentComponent,
    children : [
      { path : '', component : UserComponent },
      { path : 'order/:id', component : OrderComponent }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

ParentComponent的模板将只<router-outlet>加载其子项.


Sim*_*ver 7

如果您需要根据子路由处于活动状态来隐藏某些东西(例如数据网格或指令面板),则可以使用以下命令:

<div *ngIf="outlet.isActivated == false">
   Please select a child route!
</div>

<router-outlet #outlet="outlet"></router-outlet>
Run Code Online (Sandbox Code Playgroud)

#outlet="outlet"将引号包括在内非常重要,因为您正在导出模板变量引用。

也有router-outlet用于激活和停用的事件。

一种替代方法是在事件发生时获取子路由NavigationEnd,然后决定要显示或隐藏的内容。对于较简单的情况,第一种方法应该可以正常工作。

另外不相关的问题,我不觉得,但是你可以完全隐藏router-outlet*ngIf,你会什么都重要。


Joh*_*ohn 5

编辑:我提出了一个围绕使用模板指令的新解决方案,该指令允许设置与同一级别相对的分层路由。

示例代码/演示可以在这里找到:https : //stackblitz.com/edit/angular-routing-page-layout

更新版本(2019):https : //stackblitz.com/edit/angular-routing-page-layout-cnjpz8