¿Cómo obtener el parámetro en la ruta Angular2 de forma angular?

84

Ruta

const appRoutes: Routes = [
    { path: '', redirectTo: '/companies/unionbank', pathMatch: 'full'},
    { path: 'companies/:bank', component: BanksComponent },
    { path: '**', redirectTo: '/companies/unionbank' }
]

Componente

const NAVBAR = [
    { 
        name: 'Banks',
        submenu: [
            { routelink: '/companies/unionbank', name: 'Union Bank' },
            { routelink: '/companies/metrobank', name: 'Metro Bank' },
            { routelink: '/companies/bdo', name: 'BDO' },
            { routelink: '/companies/chinabank', name: 'China Bank' },
        ]
    },
    ...
]

Ejemplo de enlace: http://localhost:8099/#/companies/bdo

Quiero obtener String bdo en el enlace de ejemplo anterior.

Soy consciente de que puedo obtener el enlace usando window.location.href y dividirlo en una matriz. Entonces, puedo obtener el último parámetro, pero quiero saber si hay un método adecuado para hacer esto de forma angular.

Cualquier ayuda sería apreciada. Gracias

auroras boreales
fuente

Respuestas:

194

Actualización: septiembre de 2019

Como han mencionado algunas personas, se paramMapdebe acceder a los parámetros de mediante la MapAPI común :

Para obtener una instantánea de los parámetros, cuando no le importa que puedan cambiar:

this.bankName = this.route.snapshot.paramMap.get('bank');

Para suscribirse y recibir alertas sobre cambios en los valores de los parámetros (generalmente como resultado de la navegación del enrutador)

this.route.paramMap.subscribe( paramMap => {
    this.bankName = paramMap.get('bank');
})

Actualización: agosto de 2017

Desde Angular 4, paramsse han desaprobado a favor de la nueva interfaz paramMap. El código del problema anterior debería funcionar si simplemente sustituye uno por el otro.

Respuesta original

Si inyecta ActivatedRoutesu componente, podrá extraer los parámetros de ruta

    import {ActivatedRoute} from '@angular/router';
    ...
    
    constructor(private route:ActivatedRoute){}
    bankName:string;
    
    ngOnInit(){
        // 'bank' is the name of the route parameter
        this.bankName = this.route.snapshot.params['bank'];
    }

Si espera que los usuarios naveguen de un banco a otro directamente, sin navegar primero a otro componente, debe acceder al parámetro a través de un observable:

    ngOnInit(){
        this.route.params.subscribe( params =>
            this.bankName = params['bank'];
        )
    }

Para obtener los documentos, incluidas las diferencias entre los dos, consulte este enlace y busque " ruta activada "

Jugo de escarabajo
fuente
¿Hay alguna restricción en donde los componentes cargados en un router-salida de un componente de los padres va a ver diferentes parámetros ActiveRoute - Me he encontrado con un caso en el que el padre ve un parámetro, pero los componentes contenidos no veo el mismo parámetro ...
Neoheurista
No me funcionó porque agregué ActivatedRoute como proveedor para mi componente. ¡Así que asegúrate de no hacer eso! Funciona a la perfección con angular 4.2.4.
Thomas Webber
1
Porque paramMap, deberías usar en su params.get('bank')lugar.
zurfyx
¿Cuál es la diferencia entre this.route.snapshot.paramMap.get('bank');y this.route.snapshot.params.bank;?
Gil Epshtain
22

A partir de Angular 6+, esto se maneja de manera ligeramente diferente a las versiones anteriores. Como @BeetleJuice menciona en la respuesta anterior , paramMapes una nueva interfaz para obtener parámetros de ruta, pero la ejecución es un poco diferente en las versiones más recientes de Angular. Suponiendo que esto está en un componente:

private _entityId: number;

constructor(private _route: ActivatedRoute) {
    // ...
}

ngOnInit() {
    // For a static snapshot of the route...
    this._entityId = this._route.snapshot.paramMap.get('id');

    // For subscribing to the observable paramMap...
    this._route.paramMap.pipe(
        switchMap((params: ParamMap) => this._entityId = params.get('id'))
    );

    // Or as an alternative, with slightly different execution...
    this._route.paramMap.subscribe((params: ParamMap) =>  {
        this._entityId = params.get('id');
    });
}

Prefiero usar ambos porque luego, en la carga directa de la página, puedo obtener el parámetro de ID, y también si navego entre entidades relacionadas, la suscripción se actualizará correctamente.

Fuente en Angular Docs

KMJungersen
fuente
1
¿Por qué se switchMaprequeriría aquí? ¿No se llamará también al suscriptor cuando se cargue la página directamente?
aplastar
4
@crush De los documentos vinculados anteriormente: "Podría pensar en usar el mapoperador RxJS . Pero el HeroServiceresultado es un Observable<Hero>. Entonces, en su lugar, aplana el Observable con el switchMapoperador. El switchMapoperador también cancela las solicitudes anteriores en vuelo. Si el usuario vuelve a navegar a esta ruta con una nueva, idmientras HeroServiceque todavía está recuperando la antigua id, switchMapdescarta esa solicitud anterior y devuelve el héroe para la nueva id".
KMJungersen