Comment obtenir des paramètres de requête à partir de l'url en angular-5?

j'utilise angular 5.0.3, je voudrais démarrer mon application avec un tas de paramètres de requête. comme "/app?param1=hallo & param2 = 123". Chaque conseil donné dans Comment obtenir des params de requête de l'url dans angular2? ne marche pas pour moi.

des idées 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 m'aide à obtenir mes paramètres, mais je ne pense pas que ce soit la bonne façon dans un nouvel environnement angulaire.

[mise à jour:] Mon application principale ressemble @Composant.{(..}) Classe export AppComponent implements OnInit {

  constructor(private route: ActivatedRoute) {}

  ngOnInit(): void {
    // would like to get query parameters here...
    // this.route...
  }
}
46
demandé sur isherwood 2017-11-23 15:36:55

11 réponses

en angle 5, les params de requête sont accessibles en s'abonnant à ceci.route.queryParams.

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 "ceci.route.instantané.param "

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;
}
80
répondu Vijayendra Mudigal 2018-01-06 07:35:28

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');
  }
}
15
répondu dapperdan1985 2018-06-23 01:57:55

mise à Jour Angulaire 6: citant le Docs , concernant ActivatedRoute.queryParams (sur lequel la plupart des autres réponses sont basées):

Deux anciennes propriétés sont encore disponibles. Ils sont moins capable que leurs remplacements, découragés, et peuvent être dépréciés dans un futur Angulaire de la version.

params - Une Observable qui contient obligatoires et facultatives paramètre spécifique à la route. Utilisez paramMap à la place.

queryParams-un Observable qui contient les paramètres de requête disponibles pour tous les trajets. Utilisez queryParamMap à la place.

selon le Docs , la façon simple d'obtenir les paramètres de requête ressemblerait à ceci:

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

pour les méthodes plus avancées (par exemple, réemploi de composants avancés), voir ce chapitre Docs.

12
répondu grreeenn 2018-08-28 09:15:28
import { ParamMap, Router, ActivatedRoute } from '@angular/router';

constructor(private route: ActivatedRoute) {}

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

mise à JOUR

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
    }
}
5
répondu Dmitry Grinko 2017-11-30 13:22:48

son travail pour moi:

constructor(private route: ActivatedRoute) {}

ngOnInit()
{
    this.route.queryParams.subscribe(map => map);
    this.route.snapshot.queryParams; 
}

look plus d'options Comment obtenir requête de paramètres à partir de l'url dans angular2?

3
répondu izik f 2018-01-06 23:17:49

est tombé sur cette question quand je cherchais une solution similaire, mais je n'avais pas besoin de quoi que ce soit comme routage au niveau de l'application complète ou plus de modules importés.

le code suivant fonctionne très bien pour mon usage et ne nécessite pas de modules supplémentaires ou d'importations.

  GetParam(name){
    const results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
    if(!results){
      return 0;
    }
    return results[1] || 0;
  }

  PrintParams() {
    console.log('param1 = ' + this.GetParam('param1'));
    console.log('param2 = ' + this.GetParam('param2'));
  }

http://localhost:4200/?param1=hello&param2=123 sorties:

param1 = hello
param2 = 123
1
répondu Reed 2018-05-03 16:51:31

lorsque vous avez un objet route vide, c'est principalement dû au fait que vous n'utilisez pas de routeur-outlet dans votre application.composant.HTML.

sans cela, vous ne pourrez pas obtenir un objet route significatif avec des sous-objets non vides, en particulier params & queryParams.

essayez d'ajouter <router-outlet><router-outlet> juste avant d'appeler votre <app-main-component></app-main-component>

avant cela, assurez-vous que votre requête param est prête dans app-routing > which exporter la classe Itinéraire utilisé par l'Application de la composante :

param: '/param/:dynamicParam', path: MyMainComponent

bien sûr, pour obtenir votre param, j'utilise personnellement this.route.snapshot.params.dynamicParam où dynamicParam est le nom utilisé dans votre composant app-routing:)

0
répondu andrea06590 2017-11-23 16:23:37

soyez prudent avec vos itinéraires. Un "redirectTo" supprimera|supprimera tout paramètre de requête.

const appRoutes: Routes [
 {path: "one", component: PageOneComponent},
 {path: "two", component: PageTwoComponent},
 {path: "", redirectTo: "/one", pathMatch: full},
 {path: "**", redirectTo: "/two"}
]

j'ai appelé mon composant principal avec des paramètres de requête comme " / main?param1=a & param2=b et supposons que mes paramètres de requête arrivent dans la méthode "ngOnInit()" dans le composant principal avant que la redirection ne prenne effet.

mais c'est mal. La redirection viendra avant, supprimera les paramètres de la requête et appellera la méthode ngOnInit() le composant principal sans paramètres de requête.

j'ai changé la troisième ligne de mes parcours

{path: "", component: PageOneComponent},

et maintenant mes paramètres de requête sont accessibles dans les composants principaux ngOnInit et aussi dans le composant PageOneComponent.

0
répondu Lars 2017-11-24 08:53:54

trouvé dans: les composants parents reçoivent des Params vides de la route activée

a travaillé pour moi:

import {Component, OnDestroy, OnInit} from '@angular/core';
import { Router, ActivatedRoute, Params, RoutesRecognized } from '@angular/router';

@Component({
  selector: 'app-navigation-bar',
  templateUrl: './navigation-bar.component.html',
  styleUrls: ['./navigation-bar.component.scss']
})
export class NavigationBarComponent implements OnInit, OnDestroy {
  private sub: any;
  constructor(private route: ActivatedRoute, private router: Router) {}

  ngOnInit() {
    this.sub = this.router.events.subscribe(val => {
      if (val instanceof RoutesRecognized) {
        console.log(val.state.root.firstChild.params);
      }
    });
  }

  ngOnDestroy() {
    this.sub.unsubscribe();
  }

}
0
répondu Yonatan Ayalon 2017-11-26 16:32:42

vous pouvez également utiliser HttpParams , tels que:

  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;
  }
0
répondu a5tr0 2018-09-28 16:23:01

si vous n'utilisez pas de routeur angulaire, essayez querystring . Installez - le

npm install --save querystring

à votre projet. Dans votre composant faire quelque chose comme ça

import * as qs from 'querystring';
...
ngOnInit() {
   const params = qs.parse(window.location.search.substring(1));
   ...
}

le substring(1) est nécessaire parce que si vous avez quelque chose comme ceci '/mypage?foo=bar' alors le nom Clé Pour sera ?foo

0
répondu Chuk Lee 2018-09-29 01:33:30