Angular ActivatedRoute 数据 returns 空对象

Angular ActivatedRoute data returns an empty object

我有一条路线注册了一些数据:

const routes: Routes = 
[
    {path: 'my-route', data: { title: 'MyTitle' }, component: MyComponent},
];

我正在尝试使用 ActivatedRoute:

访问路线数据
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({...})
export class MyComponent implements OnInit {
  private routeData;

  constructor(private route: ActivatedRoute) {}

  ngOnInit() {
    this.routeData = this.route.data.subscribe((data) => {
      console.log(data); // this is returning an empty object {}
    });
  }
}

但由于某些原因 data 是一个空对象。

如何解决这个问题?

编辑:问题是我试图从 <router-outlet> 之外的组件访问 ActivatedRoute。所以看起来这是预期的行为。

不过我仍然认为我下面的回答对任何试图完成同样事情的人都有用。


我在 GitHub 上找到了一个解决方法(感谢 manklu),我使用它来完成我需要的工作:

import { Component, OnInit } from '@angular/core';
import { Router, RoutesRecognized } from '@angular/router';

@Component({...})
export class MyComponent implements OnInit {
  private routeData;

  constructor(private router: Router) { }

  ngOnInit() {
    this.router.events.subscribe((data) => {
      if (data instanceof RoutesRecognized) {
        this.routeData = data.state.root.firstChild.data;
      }
    });
  }
}

这样做 this.routeData 将保存我需要的路线数据(在我的例子中是页面 title)。

以下应该有效:

constructor(private route: ActivatedRoute) {}

ngOnInit() {
    console.log(this.route.snapshot.data);
}

我不知道所说的版本,但截至 Angular 6, 这对我有用:

(当然感谢 shinDath)

  routeData;
  ngOnInit() {
    //child route param doesnt go up to parent route params.
    this.router.events.subscribe((val) => {
      if (val instanceof ActivationEnd) {
        if(!$.isEmptyObject(val.snapshot.params)){
          this.routeData = val.snapshot.params;
        }
      }
    });
  }

这是我的代码的一部分(注意:我正在使用 Angular 8):

constructor(private _router: Router, private _route: ActivatedRoute) {}

ngOnInit() {
  ...
  this.listenRouting();
}

listenRouting() {
    this._router.events.subscribe((router: any) => {
      routerUrl = router.url;
      if (routerUrl && typeof routerUrl === 'string') {
        routerList = routerUrl.slice(1).split('/');
        console.log("data.breadcrumbs", this._route.snapshot.routeConfig.children.find(child => child.path === routerList[routerList.length - 1]).data.breadcrumbs);
        ...
      }
    });
}

所以数据是ActivatedRoute.snapshot.routeConfig.children数组下的"hiding"。每个 child 都包含 数据 。 在我的例子中 data 配置在 routing.module 中,例如:

const routes: Routes = [
  { path: "facility-datas",
    component: FacilityTerminal,
    data: {
      breadcrumbs: "b ft"
    }
  },
...
];
import { AfterViewInit, Component} from '@angular/core';
import { ActivatedRoute } from '@angular/router';


@Component({
  selector: 'app-users',
  templateUrl: './users.component.html',
  styleUrls: ['./users.component.scss']
})
export class UsersComponent implements AfterViewInit {
  paramId: string;

  constructor(private activatedRoute: ActivatedRoute) {}

  ngAfterViewInit(): void {
    this.paramId = this.activatedRoute.snapshot.params.id;
    console.log('paramId =', this.paramId);
  }

}

获取 外部组件的路由自定义数据 (Angular 8):

constructor(private router: Router) {}
    
ngOnInit() {
    this.router.events.subscribe(data => {
      if (data instanceof ActivationStart) {
        console.log(`Custom data`, data.snapshot.data);
      }
    });
  }

这对我有用。在我这样做之前也一直得到一个空对象。

constructor(private route: ActivatedRoute) { 
    this.route.data.subscribe(data => {
        console.log(data);
    })
}

Angular 贡献者的回答,link

this.router.events.pipe(
    filter((e) => e instanceof NavigationEnd),
    map(() => {
        let route = this.activatedRoute;

        while (route.firstChild) {
            route = route.firstChild;
        }

        return route;
    }),
    filter((route) => route.outlet === 'primary'),
    mergeMap((route) => route.data),
    tap(console.log)
);

constructor(
    private router: Router,
    private activatedRoute: ActivatedRoute,
) {}