327 votes

Comment obtenir les paramètres de requête à partir d'une URL en Angular 5 ?

J'utilise angular 5.0.3, j'aimerais démarrer mon application avec un tas de paramètres de requête tels que /app?param1=hallo&param2=123 . Chaque conseil donné dans Comment obtenir les paramètres de la requête à partir de l'url en Angular 2 ? ne fonctionne pas pour moi.

Une idée pour faire fonctionner les paramètres de requête ?

private getQueryParameter(key: string): string {
  const parameters = new URLSearchParams(window.location.search);
  return parameters.get(key);
}

Cette fonction privée me permet de récupérer mes paramètres, mais je ne pense pas que ce soit la bonne méthode dans le nouvel environnement Angular.

[mise à jour :] Mon application principale ressemble à

@Component({...})
export class AppComponent implements OnInit {

  constructor(private route: ActivatedRoute) {}

  ngOnInit(): void {
    // would like to get query parameters here...
    // this.route...
  }
}

0 votes

Utilisez-vous des routeurs ? D'où vient l'URL ?

0 votes

Oui, il y a une ActivatedRoute. J'ai mis à jour ma question pour montrer à quoi ressemble mon composant principal.

0 votes

Pouvez-vous également me montrer votre constante de route, où vous avez configuré toutes les routes ?

379voto

En Angular 5, les paramètres de la requête sont accessibles en souscrivant à l'option this.route.queryParams (notez que les versions ultérieures d'Angular recommander queryParamMap (voir aussi les autres réponses).

Exemple : /app?param1=hallo&param2=123

param1: string;
param2: string;
constructor(private route: ActivatedRoute) {
    console.log('Called Constructor');
    this.route.queryParams.subscribe(params => {
        this.param1 = params['param1'];
        this.param2 = params['param2'];
    });
}

alors que les variables de chemin sont accessibles par this.route.snapshot.params

Exemple : /param1/:param1/param2/:param2

param1: string;
param2: string;
constructor(private route: ActivatedRoute) {
    this.param1 = this.route.snapshot.params.param1;
    this.param2 = this.route.snapshot.params.param2;
}

24 votes

Selon Angular 6 docs l'utilisation de ActivatedRoute.queryParams et .params est déconseillée et pourrait être supprimée dans les futures versions ; voir la mise à jour aquí

1 votes

@ShubhenduVaid explique pourquoi, ils devraient utiliser le ngOnInit au lieu du constructeur. La meilleure pratique est d'utiliser les observables RxJS, puis d'utiliser une approche déclarative pour travailler avec les observables, et enfin d'utiliser l'asynchronisme sur le html.

0 votes

En suivant votre exemple 1. this.param1 dans n'importe quelle méthode revient comme null ou undefined. Y a-t-il un moyen de rendre ces valeurs globales pour qu'elles soient accessibles dans toute la classe ?

216voto

dapperdan1985 Points 645

C'est la solution la plus propre pour moi

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

export class MyComponent {
  constructor(
    private route: ActivatedRoute
  ) {}

  ngOnInit() {
    const firstParam: string = this.route.snapshot.queryParamMap.get('firstParamKey');
    const secondParam: string = this.route.snapshot.queryParamMap.get('secondParamKey');
  }
}

0 votes

C'est utile, merci. Depuis angular 6.0.8, j'utilise ceci et cela fonctionne pour moi : this.route.snapshot.queryParams["firstParamKey"]

3 votes

Cela fonctionne pour moi en Angular8. this.route.snapshot.queryParamMap fonctionne. this.route.snapshot.paramMap ne fonctionne pas pour moi.

6 votes

@RomeoProfijt paramMap concerne les paramètres de l'itinéraire, et non les paramètres de la requête. Si vous avez une route définie comme /myroute/:id et naviguer vers /myroute/45 alors vous pouvez obtenir 45 de paramMap.get('id') .

128voto

grreeenn Points 1075

Je sais que l'OP a demandé une solution pour Angular 5, mais pour tous ceux qui tombent sur cette question pour les versions plus récentes (6+) d'Angular. Citant le Docs concernant ActivatedRoute.queryParams (sur lequel la plupart des autres réponses sont basées) :

Deux propriétés plus anciennes sont encore disponibles. Elles sont moins capable que leurs remplacements, déconseillés, et peuvent être dépréciés dans un futur version d'Angular.

params - Un Observable qui contient les données obligatoires et facultatives. spécifiques à l'itinéraire. Utilisez plutôt paramMap.

queryParams - Un Observable qui contient les paramètres de requête disponibles à toutes les routes. Utilisez plutôt queryParamMap.

Selon le Docs la manière simple de récupérer les paramètres de la requête ressemblerait à ceci :

constructor(private route: ActivatedRoute) { }

ngOnInit() {
    this.param1 = this.route.snapshot.paramMap.get('param1');
    this.param2 = this.route.snapshot.paramMap.get('param2');
}

Pour des moyens plus avancés (par exemple, la réutilisation avancée des composants), voir ce Chapitre Docs.

EDIT :

Comme il est correctement indiqué dans les commentaires ci-dessous, cette réponse est fausse - au moins pour le cas spécifié par OP.

Le PO demande de récupérer les paramètres globaux de la requête (/app?param1=hallo&param2=123) ; dans ce cas, vous devez utiliser queryParamMap (comme dans la réponse de @dapperdan1985).

paramMap, en revanche, est utilisé sur les paramètres spécifiques à la route (par exemple, /app/:param1/:param2, ce qui donne /app/hallo/123).

Merci à @JasonRoyle et @daka de l'avoir signalé. .

24 votes

Ne devrait-on pas utiliser queryParamMap no paramMap pour récupérer les paramètres de la chaîne de requête ?

3 votes

@JasonRoyle Il semble que vous ayez raison, paramMap ne fonctionne pas.

1 votes

Cette réponse doit être corrigée en fonction des commentaires ci-dessus.

41voto

a5tr0 Points 137

Vous pouvez également utiliser HttpParams comme :

  getParamValueQueryString( paramName ) {
    const url = window.location.href;
    let paramValue;
    if (url.includes('?')) {
      const httpParams = new HttpParams({ fromString: url.split('?')[1] });
      paramValue = httpParams.get(paramName);
    }
    return paramValue;
  }

1 votes

Pour clarifier, j'ai deux domaines qui pointent vers des sites de langues différentes. localhost/ --> En, localhost/?lang=fr --> Français. Et j'ai un routage : path: '', redirectTo: '/list' . La solution this.route.snapshot ne fonctionne pas pour moi car elle redirige vers /list qui élimine la queryString 'lang'. Mais cette solution fonctionne pour moi.

0 votes

Comme @RyanHuang, j'ai un peu le même problème. Mais cette solution a fonctionné lors de mon premier essai.

0 votes

Trouver une meilleure solution que celle ci-dessus : jsonworld.com/blog/

20voto

Dmitry Grinko Points 1900
import { ParamMap, Router, ActivatedRoute } from '@angular/router';

constructor(private route: ActivatedRoute) {}

ngOnInit() {
    console.log(this.route.snapshot.queryParamMap);
}

UPDATE

import { Router, RouterStateSnapshot } from '@angular/router';

export class LoginComponent {
    constructor(private router: Router) {
        const snapshot: RouterStateSnapshot = router.routerState.snapshot;
        console.log(snapshot);  // <-- hope it helps
    }
}

6 votes

Cela ne semble pas suffisant, j'obtiens l'ActivatedRouteSnapshot mais queryParams est un objet vide, params également vide et .queryParamMap.get('name') retourne null. Il semble que ngOnInit() soit trop tôt pour obtenir de tels paramètres de requête.

0 votes

En fait, si vous voulez obtenir ces paramètres, vous devez changer votre itinéraire.

0 votes

J'ai une dizaine de paramètres dans un ordre différent. Je dois donc utiliser des paramètres de requête nommés. Et comment faire pour que mon composant d'application principal se rende compte qu'il y a 10 paramètres. url/myprogram?a=1&b=2&c=4 ... il semble que j'aie un problème ? Dois-je acheminer chaque paramètre vers un autre composant ? J'espère que non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X