Búsqueda de sitios web

typescript - Los datos de ActivatedRoute en Angular devuelven un objeto vacío


Tengo una ruta registrada con algunos datos:

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

y estoy tratando de acceder a los datos de la ruta usando 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 {}
    });
  }
}

pero por alguna razón data es un objeto vacío.

¿Cómo resolver este problema?

Respuesta #1

Editar: el problema es que estaba intentando acceder a ActivatedRoute desde un Componente que está fuera del <router-outlet>. Así que parece que este es el comportamiento previsto.

Sin embargo, todavía creo que mi respuesta a continuación puede ser útil para cualquiera que esté intentando lograr lo mismo.


Encontré una solución alternativa en GitHub (gracias manklu) que utilicé para lograr lo que necesitaba:

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;
      }
    });
  }
}

Haciendo esto, this.routeData contendrá los datos de la ruta que necesitaba (en mi caso, el título de la página).

Respuesta #2

Obtener datos personalizados de la ruta para un componente fuera de <router-outlet> (Angular 8):

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

Artículos relacionados