J'essaie de mettre à jour (ajouter, supprimer) queryParams à partir d'un composant. Dans angularJS, cela était possible grâce à:
$location.search('f', 'filters[]'); // setter
$location.search()['filters[]']; // getter
J'ai une application avec une liste que l'utilisateur peut filtrer, ordonner, etc. et j'aimerais définir dans les queryParams de l'URL tous les filtres activés afin qu'il puisse copier/coller l'URL ou la partager avec quelqu'un d'autre.
Cependant, je ne veux pas que ma page soit rechargée à chaque fois qu'un filtre est sélectionné.
Est-ce faisable avec le nouveau routeur?
Vous pouvez naviguer vers l'itinéraire actuel avec de nouveaux paramètres de requête, qui ne rechargeront pas votre page, mais mettront à jour les paramètres de requête.
Quelque chose comme (dans le composant):
constructor(private router: Router) { }
public myMethodChangingQueryParams() {
const queryParams: Params = { myParam: 'myNewValue' };
this.router.navigate(
[],
{
relativeTo: activatedRoute,
queryParams: queryParams,
queryParamsHandling: 'merge', // remove to replace all query params by provided
});
}
Notez que s'il ne recharge pas la page, il insère une nouvelle entrée dans l'historique du navigateur. Si vous souhaitez le remplacer dans l'historique au lieu d'y ajouter une nouvelle valeur, vous pouvez utiliser { queryParams: queryParams, replaceUrl: true }
.
EDIT: Comme déjà signalé dans les commentaires, []
et la propriété relativeTo
étaient manquants dans mon exemple initial. Elle aurait donc pu modifier également l'itinéraire, pas seulement les paramètres de requête. Le bon usage de this.router.navigate
sera dans ce cas:
this.router.navigate(
[],
{
relativeTo: this.activatedRoute,
queryParams: { myParam: 'myNewValue' },
queryParamsHandling: 'merge'
});
Définir la nouvelle valeur du paramètre sur null
supprimera le paramètre de l'URL.
La réponse de @ Radosław Roszkowiak est presque exacte, sauf que relativeTo: this.route
est requis comme ci-dessous:
constructor(
private router: Router,
private route: ActivatedRoute,
) {}
changeQuery() {
this.router.navigate(['.'], { relativeTo: this.route, queryParams: { ... }});
}
Dans Angular 5, vous pouvez facilement obtenir et modifier une copie de rlTree en analysant l’URL actuelle. Cela inclura des paramètres de requête et des fragments.
let urlTree = this.router.parseUrl(this.router.url);
urlTree.queryParams['newParamKey'] = 'newValue';
this.router.navigateByUrl(urlTree);
La "manière correcte" de modifier un paramètre de requête est probablement avec le createUrlTree comme ci-dessous, qui crée un nouvel UrlTree à partir du courant tout en nous permettant de le modifier à l'aide de NavigationExtras .
import { Router } from '@angular/router';
constructor(private router: Router) { }
appendAQueryParam() {
const urlTree = this.router.createUrlTree([], {
queryParams: { newParamKey: 'newValue' },
queryParamsHandling: "merge",
preserveFragment: true });
this.router.navigateByUrl(urlTree);
}
Afin de supprimer un paramètre de requête de cette façon, vous pouvez le définir sur undefined
ou null
.
Essayer
this.router.navigate([], {
queryParams: {
query: value
}
});
fonctionnera pour le même itinéraire de navigation autre que les guillemets simples.
Si vous souhaitez modifier les paramètres de requête sans modifier l'itinéraire. Voir l'exemple ci-dessous pourrait vous aider: l'itinéraire actuel est: / search & l'itinéraire cible est (sans recharger la page): / search? query = love
submit(value: string) {
{ this.router.navigate( ['.'], { queryParams: { query: value } })
.then(_ => this.search(q));
}
search(keyword:any) {
//do some activity using }
veuillez noter que vous pouvez utiliser this.router.navigate (['search']) au lieu de this.router.navigate (['.']]
La réponse avec le plus de vote a partiellement fonctionné pour moi. L'URL du navigateur est resté le même mais mon routerLinkActive
ne fonctionnait plus après la navigation.
Ma solution était d'utiliser lotation.go:
import { Component } from "@angular/core";
import { Location } from "@angular/common";
import { HttpParams } from "@angular/common/http";
export class whateverComponent {
constructor(private readonly location: Location, private readonly router: Router) {}
addQueryString() {
const params = new HttpParams();
params.append("param1", "value1");
params.append("param2", "value2");
this.location.go(this.router.url.split("?")[0], params.toString());
}
}
J'ai utilisé HttpParams pour construire la chaîne de requête car je l'utilisais déjà pour envoyer des informations avec httpClient. mais vous pouvez simplement le construire vous-même.
et la this._router.url.split("?")[0]
consiste à supprimer toutes les chaînes de requête précédentes de l'URL actuelle.
Premièrement, nous devons importer le module de routeur de angular routeur et déclarer son nom d'alias.
import { Router } from '@angular/router'; ---> import
class AbcComponent implements OnInit(){
constructor(
private router: Router ---> decalre alias name
) { }
}
1. Vous pouvez modifier les paramètres de la requête en utilisant la fonction "router.navigate" et en transmettant les paramètres de la requête.
this.router.navigate([], { queryParams: {_id: "abc", day: "1", name: "dfd"}
});
Il mettra à jour les paramètres de requête dans la route actuellement activée i.e
Ce qui suit sera redirigé vers une page abc avec _id, day et name en tant que paramètres de requête
this.router.navigate (['/ abc'], {queryParams: {_id: "abc", jour: "1", nom: "dfd"}});
Il mettra à jour les paramètres de requête dans la route "abc" avec trois paramètres de requête
Pour récupérer les paramètres de requête: -
import { ActivatedRoute } from '@angular/router'; //import activated routed
export class ABC implements OnInit {
constructor(
private route: ActivatedRoute //declare its alias name
) {}
ngOnInit(){
console.log(this.route.snapshot.queryParamMap.get('_id')); //this will fetch the query params
}