如何从父路由的组件访问激活的子路由数据?

ada*_*ort 20 angular2-routing angular

const appRoutes: Routes = [
  { path: 'parent', component: parentComp, data: { foo: 'parent data' }, children: [
    { path: 'child1', component: childComp1, data: { bar: 'child data 1' },
    { path: 'child2', component: childComp2, data: { bar: 'child data 2' }
  ]}
];
Run Code Online (Sandbox Code Playgroud)

如果我导航到/parent/child2然后查看ActivatedRoutefrom parentComp,data.foo则定义,但data.bar不是.我可以访问所有孩子的数组,但我不知道哪一个被激活.

如何从父路由的组件访问激活的子路由数据?

Jul*_*ova 26

第一个孩子将为您提供数据访问权限

constructor(route: ActivatedRoute) {
  route.url.subscribe(() => {
    console.log(route.snapshot.firstChild.data);
   });
}
Run Code Online (Sandbox Code Playgroud)

  • 所以`firstChild`不是路线儿童中定义的第一个孩子,而是其激活孩子的第一个孩子? (4认同)
  • @Cody 当你介绍孩子的时候,**你可以有多个激活的路由。** 父、子和孙子都被激活了。每个父级都可以使用 route.firstChild 访问其激活的子级。如果你需要最深激活的孩子,你可以这样做`while (route.firstChild) { route = route.firstChild }` (4认同)
  • 你知道如何在同一场景中使用 observable 吗?我尝试了 this.route.firstChild.data.subscribe 但当我导航到其他子组件时它没有被触发? (2认同)
  • @Julia,为什么不将这些子路由嵌套在无组件路由/命名空间下?你的答案从 `route.firstChild.data` 变成了 `route.firstChild.firstChild.data`。再次嵌套它,你就有了 `route.firstChild.firstChild.firstChild.data`。如果您有多个引用,这可能意味着沉重的 ChangeCost。`ActivatedRouteSnapshot` 需要的是一个 `route.lastChild` 来始终获取链中最远的对象。问题是,*`route.firstChild` 是我路由的 `children` 数组中第一个声明的吗?或者,是下一个,比如说,`"/root/grandparent/parent/child/grandchild"`?* (2认同)

Mat*_*ira 10

使用Angular 6,我设法从父组件获取当前路由数据,使用以下代码:

我已使用Extra选项配置路由器以继承父路由数据:

@NgModule({
  imports: [
    RouterModule.forRoot(routes, {
      initialNavigation: 'enabled',
      paramsInheritanceStrategy: 'always'
    }),
  ...
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

然后在我的父组件中,我能够看到数据更改:

import { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';
import { Subscription } from 'rxjs';
import { filter, map } from 'rxjs/operators';

subs: Array<Subscription> = [];

constructor(private router: Router, private route: ActivatedRoute) {
  this.subs[0] = this.router.events
    .pipe(
      filter(event => event instanceof NavigationEnd),
      map(() => this.route.snapshot),
      map(route => {
        while (route.firstChild) {
          route = route.firstChild;
        }
        return route;
      })
    )
    .subscribe((route: ActivatedRouteSnapshot) => {
      console.log(route.data);
    });
}

ngOnDestroy() {
  this.subs.forEach(s => s.unsubscribe());
}
Run Code Online (Sandbox Code Playgroud)

请享用!


con*_*bug 8

在 Angular 8 中使用:

data: any;

constructor(route: ActivatedRoute) {
  this.data = route.snapshot.firstChild.data;
}
Run Code Online (Sandbox Code Playgroud)

  • @GustavoBarros 为什么不需要 .subscribe?这样,您将仅拥有第一个激活的路线的数据,并且当您更改当前组件内部的路线时,它不会改变。您应该订阅更改,或者使用诸如“get data() { return this.route.snapshot.firstChild.data; }` 而不是 `data: any;` 来始终获取当前活动子路由的数据 (3认同)