Angular: Cómo actualizar queryParams sin cambiar la ruta
Estoy tratando de actualizar (añadir, eliminar) queryParams de un componente. En angularJS, solía ser posible gracias a:
$location.search('f', 'filters[]'); // setter
$location.search()['filters[]']; // getter
Tengo una app con una lista que el usuario puede filtrar, ordenar, etc y me gustaría establecer en los queryParams de la url todos los filtros activados para que pueda copiar/pegar la url o compartirla con otra persona.
Sin embargo, no quiero que mi página se recargue cada vez que se selecciona un filtro.
¿Es esto posible con el nuevo router?
89
3
Puede navegar a la ruta actual con nuevos parámetros de consulta, lo que no recargará su página, pero actualizará los parámetros de consulta.
Algo como (en el componente):
-- language-all: lang-js -->
Tenga en cuenta que, aunque no recargará la página, añadirá una nueva entrada al historial del navegador. Si desea reemplazarlo en la historia en lugar de añadir un nuevo valor allí, usted podría utilizar
{ queryParams: queryParams, replaceUrl: true }
.EDITAR: Como ya se ha señalado en los comentarios,
[]
y la propiedadrelativeTo
faltaba en mi ejemplo original, por lo que podría haber cambiado la ruta, así, no sólo los parámetros de consulta. El uso correcto dethis.router.navigate
será en este caso:Establecer el nuevo valor del parámetro a
null
eliminará el parámetro de la URL.En Angular 5 puedes obtener y modificar fácilmente una copia del urlTree analizando la url actual. Esto incluirá parámetros de consulta y fragmentos.
La forma "correcta" de modificar un parámetro de consulta es probablemente con la función createUrlTree como el de abajo que crea un nuevo UrlTree a partir del actual mientras nos permite modificarlo usando NavigationExtras.
Para eliminar un parámetro de consulta de esta forma puedes establecerlo como
undefined
onull
.Si desea cambiar los parámetros de la consulta sin cambiar la ruta, consulte el siguiente ejemplo ejemplo puede ayudarle: la ruta actual es : /buscar & La ruta de destino es(sin recargar la página) : /buscar?consulta=amor
nota : puedes usar this.router.navigate( ['search'] en vez de this.router.navigate( ['.'].