Angular2 router, obtener datos de ruta de url, para mostrar migas de pan


Estoy usando angular2 router.

Para dibujar la migaja de una url, digamos site.com/a/b/c/15 Hago lo siguiente:

  1. Obtener la ruta de site.com/a/b/c/15 y obtener el nombre bonito asociado a la ruta
  2. Obtener la ruta de site.com/a/b/c y obtener el nombre bonito asociado a la ruta
  3. Obtener la ruta de site.com/a/b y obtener el bonito nombre asociado a la ruta
  4. Obtener la ruta de site.com/a y obtener el nombre bonito asociado a la ruta

Así que digamos que tengo las siguientes rutas:

{ path: 'a', component: A, data:{prettyName: 'I am A'}}
{ path: 'b', component: B, data:{prettyName: 'I am B'}},
{ path: 'c', component: C, data:{prettyName: 'I am C'}},

El resultado de mi proceso sería un array conteniendo {"I am C", "I am B", "I am C"} y gracias a eso puedo mostrar una buena migaja "I am A > I am B > I am C" que explica la ruta actual.

Este uso para trabajar con el router-en desuso haciendo

this.router.recognize(url).then((instruction) => {
    instruction.component.routeData.get('prettyName') // Would return 'I am ..'

Sin embargo ahora; con el último enrutador ya no puedo procesar esta lógica de reconocimiento.

¿Cómo obtener los datos de ruta asociados a una url ?

Author: Mark Rajcok, 2016-07-11

2 answers

Actualizado para RC5

En lugar de comenzar con la URL actual e intentar obtener las rutas desde la URL, puede obtener todas las rutas activadas (asociadas con la salida principal) desde RouterState:

Después del final de cada ciclo de navegación exitoso, el enrutador construye un árbol de ActivatedRoutes, que conforman el estado actual del enrutador. Podemos acceder al RouterState actual desde cualquier lugar de nuestra aplicación utilizando el servicio Router y el routerState propiedad.

El estado del enrutador nos proporciona métodos para recorrer arriba y abajo del árbol de rutas desde cualquier ruta activada para obtener información que podamos necesitar de las rutas padre, hijo y hermano. -- referencia

Suscríbase a los eventos del enrutador, luego, después de cada evento NavigationEnd, camine por el árbol de ActivatedRoute s desde root:

import { Component } from '@angular/core';
import { Router, ActivatedRoute, NavigationEnd } from '@angular/router';
import 'rxjs/add/operator/filter';

@Component({
  selector: 'breadcrumbs',
  template: `
  <div>
    breadcrumbs: 
    <span *ngFor="let breadcrumb of breadcrumbs; let last = last">
      <a [routerLink]="breadcrumb.url">{{breadcrumb.label}}</a>
      <span *ngIf="!last">></span>
    </span>
  </div>`
})
export class BreadcrumbsComponent {
  breadcrumbs: Array<Object>;
  constructor(private router:Router, private route:ActivatedRoute) {}
  ngOnInit() {
    this.router.events
      .filter(event => event instanceof NavigationEnd)
      .subscribe(event => {  // note, we don't use event
        this.breadcrumbs = [];
        let currentRoute = this.route.root,
            url = '';
        do {
          let childrenRoutes = currentRoute.children;
          currentRoute = null;
          childrenRoutes.forEach(route => {
            if(route.outlet === 'primary') {
              let routeSnapshot = route.snapshot;
              console.log('snapshot:', routeSnapshot)
              url += '/' + routeSnapshot.url.map(segment => segment.path).join('/');
              this.breadcrumbs.push({ 
                label: route.snapshot.data.breadcrumb,
                url:   url });
              currentRoute = route;
            }
          })
        } while(currentRoute);
      })
  }
}

Las rutas se ven así:

{ path: '', component: HomeComponent, data: {breadcrumb: 'home'}}

Émbolo - RC.5, router 3.0.0-rc.1


Véase también https://stackoverflow.com/a/38310404/215945 para una solución similar.

 23
Author: Mark Rajcok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:46:52

Hasta ahora, la solución más factible es (hecho):

  • Hacer las rutas exportables / importables
  • Obtenga la actualización de url actual del enrutador.eventos suscribirse
  • En el cambio de url, haga un bucle en la ruta de las rutas, vea si el patrón coincide con la url
  • Si el patrón coincide con la url, obtenga los datos de la ruta coincidente

Pros: works

Contras: rehacer el manual de reconocimiento de url-ruta sin usar el enrutador ng2 one

 2
Author: ATX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-12 18:53:01