我试图获得
中定义的:id paramRouterModule.forRoot([
{
path: 'orders',
component: ListComponent,
children: [
{
path: 'view/:id',
component: ViewComponent
},
]
}
])
来自ListComponent的。
我已经尝试过了:
route: ActivatedRoute
route.params.subscribe(params => {
let id = +params['id'];
})
从ListComponent ,但是params数组是空的,我想是因为:id param属于viewComponent而不是listComponent
如何在listComponent中获取id参数?
答案 0 :(得分:26)
您可以使用' '
属性或firstChild
来获取子路线:
ActivatedRoute
答案 1 :(得分:10)
要在父组件中获取子项的参数,我使用了ActivatedRoute的firstChild属性,因为我只有子路径
route: ActivatedRoute
route.firstChild.params.subscribe(params => {
let id = +params['id'];
});
答案 2 :(得分:3)
递归寻找儿童参与不会总是得到你正在寻找的参数。特别是在移动路线时。
相反,RxJS ReplaySubject
可用于发布当前子ID。
创建新服务:
@Injectable()
export class ChildIdService {
current$ = new ReplaySubject<number>();
}
将其导入子组件并订阅重播主题:
export class ChildComponent implements OnInit {
constructor(private ar: ActivatedRoute, public ci: ChildIdService){}
ngOnInit(){
this.ar.params.map(params => +params.id).subscribe(this.ci.current$);
}
}
在父组件上导入服务并使用异步管道订阅子值:
<span>Mother component child ID: {{ci.current$ | async}}</span>
以下是一个工作代码段:https://stackblitz.com/edit/angular-b8xome(在浏览器应用预览中添加/ child / 42以查看其是否有效)
或者将组件定义为兄弟,并将父组件添加为无组件路由,例如:“https://vsavkin.com/the-powerful-url-matching-engine-of-angular-router-775dad593b03在”使用相同数据的同级组件“下
答案 3 :(得分:0)
如果只有一个子路由,您可以继续挖掘route.firstChild.params['id']
或使用route.children[0].children[1].params['id']
之类的东西来使用括号表示法挖掘多个级别来访问兄弟路由。在找到正确的水平时,它有点反复试验。
答案 4 :(得分:0)
另一种方法是在父组件中添加以下内容:
<ng-container *ngIf="routerOutlet.isActivated && routerOutlet.activatedRoute?.paramMap | async as paramMap">
child id is: {{paramMap.get('id')}}!
</ng-container>
<router-outlet #routerOutlet="outlet"></router-outlet>
当然,最好在子级使用有解析器而不是params
<ng-container *ngIf="routerOutlet.activatedRouteData['child'] as child">
child id is : {{child.id}}
</ng-container>
<router-outlet #routerOutlet="outlet"></router-outlet>
假设子路线具有以下特征:
// ...
resolve: {
child: 'childResolver',
},
和子解析器可以在某些模块中:
// ...
providers: [{
provide: 'childResolver',
useValue: (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => ({
id: route.paramMap.get('id')
})
}],