Angular中如何从主路由组件触发同级命名路由?
Angular 同级命名路由出口导航失败问题
页面布局
<div> <router-outlet /> <div class="details"> <router-outlet name="details"></router-outlet> </div> </div>
顶层路由配置
routes = [ { path: 'some-component', component: SomeComponent, }, { path: 'my-details', component: DetailsComponent, outlet: 'details' } ]
问题描述
进入some-component路由后,在组件模板中使用以下代码尝试激活同级details命名出口的my-details路由:
[routerLink]="[{outlets:{details:['my-details']}}]"
点击后触发路由未找到错误(已配置通配符路由),尝试添加[relativeTo]="route.parent"也没有效果。将命名出口移入SomeComponent并设为some-component的子路由可以正常工作,但不符合业务需求。
解决方法
问题出在导航的相对路径上:当前激活的是some-component子路由,默认的相对导航会在some-component的子路由范围内寻找details出口,但你的details出口是和主出口同级的顶层出口,因此必须基于根路由进行绝对导航,同时保留当前主路由的状态。
模板中使用routerLink的正确写法
[routerLink]="['/', { outlets: { primary: 'some-component', details: 'my-details' } }]"
这里的primary是主路由出口的默认名称,明确指定主路由保持some-component,同时激活details出口的my-details路由。
组件类中使用Router导航的写法
如果需要在逻辑代码中触发导航,可以指定相对根路由:
import { Router } from '@angular/router'; constructor(private router: Router) {} // 触发导航 this.router.navigate( [{ outlets: { details: ['my-details'] } }], { relativeTo: this.router.routerState.root } );
核心逻辑:当命名路由出口与主出口处于同一顶层层级时,必须从根路由上下文出发进行导航,否则Angular会错误地在当前激活的子路由下寻找命名出口,导致路由匹配失败。
内容的提问来源于stack exchange,提问作者tlt
相关产品推荐
相关产品推荐

