Angular 2: ¿Cómo obtengo los parameters de una ruta desde afuera de un enrutador?

Pregunta similar a Angular2 Obtenga parameters de enrutador fuera del enrutador pero con la versión de lanzamiento de Angular 2 (por lo que la versión 3.0.0 del enrutador). Tengo una aplicación con una list de contactos y una salida de enrutador para mostrar o editar el contacto seleccionado. Quiero asegurarme de que se selecciona el contacto apropiado en cualquier punto (incluso en la carga de la página), por lo que me gustaría poder leer el parámetro "id" de la ruta cada vez que se cambie la ruta.

Puedo tener acceso a los events de routing suscribiéndome a la propiedad de events del enrutador, pero el object Evento simplemente me da acceso a la url en bruto, no a una versión analizada de la misma. Puedo analizar eso usando el método parseUrl del enrutador, pero el formatting de esto no es particularmente útil y sería bastante frágil, así que prefiero no usarlo. También he examinado la propiedad routerState del enrutador en los events de routing, pero params es siempre un object vacío en la instantánea.

¿Hay una manera directa y directa de hacer esto que me he perdido? ¿Tendría que envolver la list de contactos en un enrutador que nunca cambia para que funcione, o algo así?

He estado luchando con este tema durante todo el día, pero creo que finalmente descubrí una manera de cómo hacerlo escuchando uno de los events del enrutador en particular. Esté preparado, es un poco complicado (¿feo?), Pero a partir de hoy está funcionando, al less con la última versión de Angular (4.x) y enrutador angular (4.x). Este fragment de código podría no estar funcionando en el futuro si cambian algo.

Básicamente, encontré una manera de get el path de la ruta y luego rebuild un map de parameters personalizado por mi count.

Asi que aqui esta:

import { Component, OnInit } from '@angular/core'; import { Router, RoutesRecognized } from '@angular/router'; @Component({ selector: 'outside-router-outlet', templateUrl: './outside-router-outlet.component.html', styleUrls: ['./outside-router-outlet.component.css'] }) export class OutSideRouterOutletComponent implements OnInit { path: string; routeParams: any = {}; constructor(private router: Router) { } ngOnInit() { this.router.events.subscribe(routerEvent => { if (routerEvent instanceof RoutesRecognized) { this.path = routerEvent.state.root['_routerState']['_root'].children[0].value['_routeConfig'].path; this.buildRouteParams(routerEvent); } }); } buildRouteParams(routesRecognized: RoutesRecognized) { let paramsKey = {}; let splittedPath = this.path.split('/'); splittedPath.forEach((value: string, idx: number, arr: Array<string>) => { // Checking if the chunk is starting with ':', if yes, we suppose it's a parameter if (value.indexOf(':') === 0) { // Attributing each parameters at the index where they were found in the path paramsKey[idx] = value; } }); this.routeParams = {}; let splittedUrl = routesRecognized.url.split('/'); /** * Removing empty chunks from the url, * because we're splitting the string with '/', and the url starts with a '/') */ splittedUrl = splittedUrl.filter(n => n !== ""); for (let idx in paramsKey) { this.routeParams[paramsKey[idx]] = splittedUrl[idx]; } // So here you now have an object with your parameters and their values console.log(this.routeParams); } }