route navigate multiple example child angular typescript routing routes

multiple - router.navigate angular 6



Los parĂ¡metros de Angular 2 Activatedroute no funcionan en el servicio o fuera de<router-outlet> (3)

Aquí hay un servicio angular que hace eso:

import {Injectable} from ''@angular/core''; import {ActivatedRoute, NavigationEnd, NavigationExtras, ParamMap, Router} from "@angular/router"; import {RouterExtensions} from "nativescript-angular/router"; import {NavigationOptions} from "nativescript-angular/router/ns-location-strategy"; import {Observable} from "rxjs/Observable"; import {first} from "rxjs/operators/first"; import {filter} from "rxjs/operators/filter"; import {map} from "rxjs/operators/map"; import {switchMap} from "rxjs/operators/switchMap"; import {unRegisterAndroidOnBack} from "../../utils/view.utils"; @Injectable() export class RoutingService { constructor(private routerExtensions: RouterExtensions, private route: ActivatedRoute, private router: Router) { } public getActivatedRouteParameter(paramName: string): Observable<ParamMap> { return this.router.events.pipe(filter(e => e instanceof NavigationEnd), map((): ActivatedRoute => { let route = this.route; while (route.firstChild) { route = route.firstChild; } return route; }), filter((route: ActivatedRoute) => route.outlet === ''primary''), switchMap((route: ActivatedRoute) => route.paramMap) , first()); }

.

Tengo un problema muy extraño: index.html

<navigation-menu *ngIf="isLoggedIn"></navigation-menu> <div class="content-wrapper" [ngClass]="{''fullContent'' : !isLoggedIn}"> <section class="content"> <router-outlet></router-outlet> </section> </div>

El menú de navegación es un componente del menú de navegación. En el contenido del enrutador de salida hay un componente llamado "activos".

Lo que hice en el componente activo:

import { ActivatedRoute}from "@angular/router"; constructor(private route: ActivatedRoute){} public ngOnInit(): void { this.route.params.subscribe(params => { const id = params["id"]; }

Esto funciona y obtengo los parámetros de mi ruta (que es una especie de "asset /: id).

Ahora intenté lo mismo en mi Componente de menú de navegación (que está "fuera" de la salida del enrutador) y en un servicio global llamado contextservice. El mismo código que el anterior, pero ni siquiera se activa en el cambio de ruta. Si intento obtener una instantánea actual del router

const strId = this.route.snapshot.params["id"];

después de que se activó el evento NavigationEnd, se obtiene el mismo resultado: strId no está definido porque los parámetros son un objeto vacío.

Solo funciona en mi componente de activos. ¿Funciona según lo previsto o cómo debe manejarse?

Mi intención era desencadenar un evento desde un servicio global (o un componente "global" como el menú de navegación) que escucha todos los cambios de ruta (-params).

Mi única solución sería analizar la url completa después de cada evento de NavigationEnd que, en mi opinión, no es una forma adecuada ... O para manejar el cambio de parámetros en cada componente secundario (en enrutador-salida).

Tal vez tengo un error básico en la comprensión ...

Gracias

Solución de respuesta aceptada:

this.router.events.subscribe(val => { if (val instanceof RoutesRecognized) { var strId = val.state.root.firstChild.params["id"]; }});

No te olvides de importar rutas reconocidas desde el enrutador angular!


El componente agregado por el enrutador obtiene el segmento del enrutador ( ActivatedRoute ) pasado, pero en un servicio no hay una ruta activada. Puede suscribirse a router.events y recorrer el árbol de rutas (router.firstChild ... `) para obtener los parámetros de una secuencia de ruta específica que necesita.

Consulte también https://github.com/angular/angular/issues/11023


En realidad, tu actividad activada está correcta y actualizada, pero tienes todo el árbol en eso. así que si vas todo el camino dentro de route.firstChild, finalmente encontrarás la última ruta, a la que llamé deepActivatedRoute (dentro de route.firstChild ... route.firstChild)

Entonces, lo que hice fue crear un servicio para rastrear el deepRoute, y tenerlo siempre accesible

import { Injectable } from ''@angular/core''; import { ActivatedRoute, NavigationEnd, Router } from ''@angular/router''; @Injectable() export class ActivatedRouteService { private _deeperActivatedRoute: ActivatedRoute; get deeperActivatedRoute(): ActivatedRoute { return this._deeperActivatedRoute; } constructor(private router: Router, private route: ActivatedRoute) {} init(): void { this.router.events.subscribe(event => { if (event instanceof NavigationEnd) { // Traverse the active route tree let activatedChild = this.route.firstChild; if (activatedChild != null) { let nextActivatedChild; while (nextActivatedChild != null) { nextActivatedChild = activatedChild.firstChild; if (nextActivatedChild != null) { activatedChild = activatedChild.firstChild; } } } this._deeperActivatedRoute = activatedChild || this.route; } }); } }

Luego, en app.component.ts, comienzo el servicio (solo para asegurar que siempre esté siguiendo)

export class AppComponent { constructor(private activatedRouteService: ActivatedRouteService) { this.activatedRouteService.init(); } }

Y finalmente, tome su ruta donde sea que esté:

export class ForbiddenInterceptor implements HttpInterceptor { constructor(private activatedRouteService: ActivatedRouteService) { } doYourStuff(): void { //you''ll have the correct activatedRoute here this.activatedRouteService.deeperActivatedRoute; } }

Respondiendo a la pregunta, solo puede tomar la función deepActivatedRoute y comprobar normalmente snapshop.url, tal como lo haría en un componente