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:
- Obtener la ruta de
site.com/a/b/c/15
y obtener el nombre bonito asociado a la ruta - Obtener la ruta de
site.com/a/b/c
y obtener el nombre bonito asociado a la ruta - Obtener la ruta de
site.com/a/b
y obtener el bonito nombre asociado a la ruta - 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 ?
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
ActivatedRoute
s, que conforman el estado actual del enrutador. Podemos acceder alRouterState
actual desde cualquier lugar de nuestra aplicación utilizando el servicioRouter
y elrouterState
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.
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
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