Me doy cuenta de que router.isActive devuelve false cada vez que se abre una ruta secundaria.
¿Es router.isActive adecuado para verificar '¿estoy en la ruta (x)?' (p. ej.: página de pagos), independientemente de los estados hash, los parámetros de consulta y las rutas secundarias .
¿Debería ser router.isActive el servicio/llamada adecuado para deducir esto? O está destinado a algo más simple. ¿Hay alguna alternativa? ¿Debería escribir mi propio servicio?
P.ej:
/second , router.isActive('second', true) === verdaderosecond(modal:my-modal) , router.isActive('second', true) === false/second , router.isActive('', false) === true. (las coincidencias no exactas devuelven estados padre/hijo verdaderosCreé una prueba de concepto de plnkr para facilitar las pruebas:
Echando un vistazo a la fuente aquí:
https://github.com/angular/angular/blob/master/packages/router/src/router.ts#L493
Entonces, especifica un urlTree o una cadena, y si es necesaria una coincidencia exacta.
Echemos un vistazo a lo que hace después de eso.
return containsTree(this.currentUrlTree, urlTree, exact);
Así que echemos un vistazo a containsTree .
https://github.com/angular/angular/blob/master/packages/router/src/url_tree.ts#L16
Parece que hace una comparación exacta con un contiene contra el árbol dependiendo del valor de exact .
Un poco más de investigación nos lleva aquí:
export function shallowEqual(a: {[x: string]: any}, b: {[x: string]: any}): boolean { const k1 = Object.keys(a); const k2 = Object.keys(b); if (k1.length != k2.length) { return false; } let key: string; for (let i = 0; i < k1.length; i++) { key = k1[i]; if (a[key] !== b[key]) { return false; } } return true; } Así que parece que las comparaciones de urlTree se realizan utilizando un algoritmo de comparación superficial 'genérico' para determinar la exactitud. Eso me hace pensar que el método isActive() actual no es lo suficientemente robusto (o fue diseñado intencionalmente de esa manera) para tomar determinaciones en el nivel de granularidad que necesita.
No estoy seguro de si hay una mejor manera (aparte de tal vez analizarlo usted mismo), o si esto es intencional para el método isActive() . Supongo que el método isActive() (cuando se usa la exactitud) probablemente se escribió de esta manera porque el término exact implica que incluso tener la ruta secundaria no produce una coincidencia exacta.
Probablemente valga la pena discutirlo con los chicos de Angular para ver si hay alguna forma de enganchar esa información.