2017-01-09 52 views
9

我试着去获得:在如何获得:孩子航线的ID PARAM从父组件在Angular2

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

从ListComponent定义ID PARAM。

我已经尝试:

route: ActivatedRoute 

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

从ListComponent,但参数数组是空的,我想它,因为:ID参数所属到viewComponent不listComponent

我怎样才能在ID PARAM listComponent?

回答

8

可以使用firstChild属性或ActivatedRoute让孩子航线:

route.firstChild.snapshot.params['id'] 
+0

看起来像属性routerState不存在ActivatedRoute,我也想获得父组件中的id不是子组件,所以我用route.firstChild.params –

+0

我误解了这个问题,并假设@run码回答你真正想要的东西。我更新了我的答案。 –

+0

完美,它的工作原理,谢谢 –

0

可以保留通过route.firstChild.params['id']挖如果仅仅是一个孩子的路线或使用类似route.children[0].children[1].params['id']挖通过使用括号符号的多个级别来访问同级路线。当谈到找到正确的水平时,它有点试验和错误。

+0

谢谢我已经这样做 –

3

获取父组件内孩子的参数,可以我用ActivatedRoute的则firstChild属性,因为我只有孩子航线上

route: ActivatedRoute 

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

唯一正确的答案,因为事情从来没有发生在Angular同步,这个答案也包含订阅(异步)部分。 –

+0

迄今为止的最佳答案,它涵盖了订阅点。 –

1

递归发现孩子PARAMS不会总是得到你正在寻找的PARAMS 。特别是在移动路线时。

相反,RxJS ReplaySubject可用于发布当前的子标识。

创建新的服务:

@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(添加/孩子/ 42浏览应用程序的预览,看看它的工作)


或者定义下的组件和兄弟姐妹和家长componentless路线,例:https://vsavkin.com/the-powerful-url-matching-engine-of-angular-router-775dad593b03“同级组件使用相同的数据”

+0

使用ReplaySubject而不是其他类型主题的任何特定原因?我仍然试图为他们掌握用例,所以在这个例子中理解它会有所帮助。 – Seedmanc

+0

ReplaySubject会记住以前的结果,使得未来的订阅成为可观察的热点。 如果您在多个位置订阅此可观察项并希望访问以前推送的结果,这会很有帮助。 – golfadas