43

我正在尝试获取:id定义的参数

RouterModule.forRoot([
  {
    path: 'orders',
    component: ListComponent,
    children: [
      {
        path: 'view/:id',
        component: ViewComponent
      },
    ]
  }
])

ListComponent.

我已经尝试过:

route: ActivatedRoute

route.params.subscribe(params => {
  let id = +params['id'];
})

from ListComponent,但params数组为空,我想这是因为:id参数属于ViewComponentnot ListComponent

我怎样才能得到id参数ListComponent

4

5 回答 5

66

您可以使用firstChild属性或ActivatedRoute获取子路由:

route.firstChild.snapshot.params['id']
于 2017-01-09T17:17:35.750 回答
18

为了在父组件中获取子组件的参数,我使用了 ActivatedRoute 的 firstChild 属性,因为我只有子路由

route: ActivatedRoute

route.firstChild.params.subscribe(params => {
  let id = +params['id'];
});
于 2017-01-09T17:45:11.037 回答
4

递归查找子参数不会总是让你得到你正在寻找的参数。特别是在移动路线时。

ReplaySubject相反,可以使用RxJS发布当前子 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在“使用相同数据的同级组件”下"

于 2017-09-27T09:56:05.687 回答
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>

当然,在孩子身上使用解析器而不是参数会更好

<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')
    })
  }],
于 2020-02-10T08:22:41.740 回答
0

如果只有一个子路由,您可以继续挖掘,route.firstChild.params['id']或者使用类似route.children[0].children[1].params['id']使用括号表示法挖掘多个级别来访问兄弟路由。在找到正确的水平时,它有点反复试验。

于 2017-01-09T17:26:21.033 回答