Как обрабатывать параметры запроса в angular 2

В моем routable component у меня есть

@RouteConfig {
  {path: '/login',   name: 'Login', component: LoginComponent}
}  

Но как мне получить параметры запроса, если я перейду к app_url/login?token=1234?


person monty_lennie    schedule 04.01.2016    source источник
comment
Angular 2.1.0 предоставляет наблюдаемый объект ActivatedRoute, который следует использовать сейчас. Проверьте мой ответ.   -  person marcel    schedule 21.11.2016


Ответы (12)


В дополнение к двум предыдущим ответам Angular2 поддерживает как параметры запроса, так и переменные пути в маршрутизации. В определении @RouteConfig, если вы определяете параметры внутри пути, Angular2 обрабатывает их как переменные пути и как параметры запроса, если нет.

Возьмем образец:

@RouteConfig([
  { path: '/:id', component: DetailsComponent, name: 'Details'}
])

Если вы вызываете метод navigate маршрутизатора следующим образом:

this.router.navigate( [
  'Details', { id: 'companyId', param1: 'value1'
}]);

У вас будет следующий адрес: /companyId?param1=value1. Способ получения параметров одинаков как для параметров запроса, так и для переменных пути. Разница между ними в том, что переменные пути можно рассматривать как обязательные параметры, а параметры запроса — как необязательные.

Надеюсь, это поможет вам, Тьерри.

ОБНОВЛЕНИЕ: после изменений в параметрах http-запроса маршрутизатора alpha.31 больше не работают (Параметры матрицы #2774). Вместо этого угловой маршрутизатор использует так называемую матричную нотацию URL.

Ссылка https://angular.io/docs/ts/latest/guide/router.html#!#Optional-route-parameters:

Необязательные параметры маршрута не разделяются знаком "?" и "&", как они должны быть в строке запроса URL. Они разделены точкой с запятой ";" Это матричная нотация URL — то, что вы, возможно, не видели раньше.

person Thierry Templier    schedule 05.01.2016
comment
Я искал это часами! Но это так не работает, URL-адрес должен выглядеть так /companyId;param1=value1;param2=value2. В любом случае, спасибо, что указали мне правильный путь, вы можете обновить свой ответ, если я прав. - person Silencer; 09.02.2016
comment
Я согласен с Silcener. ? не работает, вместо этого я также должен использовать точку с запятой. - person abedurftig; 15.04.2016
comment
В последней документации маршрутизатора говорится: параметры строки запроса больше не разделяются символом ? и &. Они разделены точкой с запятой (;) Это матричная нотация URL... - person reduckted; 23.05.2016
comment
Я ненавижу голосовать против, но этот отличный ответ нужно обновить. - person Methodician; 30.07.2016
comment
с какой стати они используют матричную нотацию URL и как переключиться обратно. Это создает проблемы при отправке параметров, содержащих знаки /, + и =. - person Toolkit; 03.06.2017
comment
Я понимаю, что этот ответ был принят в прошлом, но поскольку ОБНОВЛЕНИЕ, упомянутое в сообщении, не имеет действительного ответа на навигацию по параметрам запроса. Ответ Стивена помог мне, разбив необходимые параметры Navigate на переменные. В частности: пусть navigationExtras = { queryParams: { 'session_id': sessionId }, фрагмент: 'якорь' }; - person samneric; 27.01.2018
comment
Как теперь получить эти параметры обозначения URL-адреса матрицы (используя ;)? Точно так же, как обычные параметры запроса с ? и &? Например. activeRoute.snapshot.params['param1']; - person danger89; 02.05.2018
comment
По-видимому, если вы используете activeRoute.snapshot.queryParams, это не работает с нотацией ; (но работает с нотацией ? и &). activeRoute.snapshot.params - это то, что, кажется, работает с новой нотацией ;. В этом есть смысл, но не совсем интуитивный. - person Leaky; 20.07.2019

RouteParams теперь устарели, так что вот как это сделать в новом маршрутизаторе.

this.router.navigate(['/login'],{ queryParams: { token:'1234'}})

И затем в компоненте входа в систему вы можете взять параметр,

constructor(private route: ActivatedRoute) {}
ngOnInit() {
    // Capture the token  if available
    this.sessionId = this.route.queryParams['token']

}

Здесь находится документация

person Jayantha Lal Sirisena    schedule 17.08.2016
comment
чтобы заставить это работать, мне пришлось сделать this.route.snapshot.queryParams... - person Lyle Rolleman; 18.05.2017
comment
Чтобы добавить к этому, теперь кажется (в настоящее время angular 5), что вам нужно ссылаться на моментальный снимок, если вы читаете это, убедитесь, что вы включили .snapshot.queryParams, чтобы сэкономить время и прочитать об этом здесь angular.io/guide/router#!#Optional-route-parameters спасибо @LyleRolleman за указание на это - person Cacoon; 27.02.2018

Похоже, что RouteParams больше не существует и заменено на ActivatedRoute. ActivatedRoute дает нам доступ к параметрам нотации URL матрицы. Если мы хотим получить параметры строки запроса ?, нам нужно использовать заголовок Router.RouterState. традиционные параметры строки запроса сохраняются при маршрутизации, что может быть нежелательным результатом. Сохранение фрагмента теперь является необязательным в маршрутизаторе 3.0.0-rc.1.

import { Router, ActivatedRoute } from '@angular/router';
@Component ({...})
export class paramaterDemo {
  private queryParamaterValue: string;
  private matrixParamaterValue: string;
  private querySub: any;
  private matrixSub: any;

  constructor(private router: Router, private route: ActivatedRoute) { }
  ngOnInit() {
    this.router.routerState.snapshot.queryParams["queryParamaterName"];
    this.querySub = this.router.routerState.queryParams.subscribe(queryParams => 
      this.queryParamaterValue = queryParams["queryParameterName"];
    );

    this.route.snapshot.params["matrixParameterName"];
    this.route.params.subscribe(matrixParams =>
      this.matrixParamterValue = matrixParams["matrixParameterName"];
    );
  }

  ngOnDestroy() {
    if (this.querySub) {
      this.querySub.unsubscribe();
    }
    if (this.matrixSub) {
      this.matrixSub.unsubscribe();
    }
  }
}

Мы должны иметь возможность манипулировать нотацией ? при навигации, а также нотацией ;, но я пока заставил работать только матричную нотацию. plnkr, прикрепленный к последняя документация по маршрутизатору показывает, что она должна выглядеть так: это.

let sessionId = 123456789;
let navigationExtras = {
  queryParams: { 'session_id': sessionId },
  fragment: 'anchor'
};

// Navigate to the login page with extras
this.router.navigate(['/login'], navigationExtras);
person Stephen    schedule 22.07.2016
comment
Получил традиционные параметры запроса, работающие благодаря этому ответу. У матричной нотации есть проблемы в Hotmail. Если вам нужно отправить пользователю ссылку активации (с параметрами), Hotmail будет кодировать точку с запятой, разбивая URL-адрес. - person Markus Pint; 22.07.2016
comment
Привет, Стивен, что это значит. Традиционные параметры строки запроса сохраняются при маршрутизации. Не могли бы вы привести несколько примеров? Я не понял, я также прочитал документы, но я все еще борюсь с этим. - person AndroidLover; 25.07.2016
comment
Скажем, вы переходите на свою страницу через http:/someurl/a-route?do-thing=delete-variable, а затем переходите через this.router.navigate(['/login']), в итоге вы окажетесь на http:/someurl/ логин?делать-вещь=установить-переменную. Если вы сделали http:/someurl/a-route;do-thing=set-variable, то перейдете к http:/someurl/login. - person Stephen; 28.07.2016
comment
3.0.0-rc.1 (2016-08-09) Параметры запроса и фрагмент больше не сохраняются по умолчанию github.com/angular/angular/blob/master/modules/@angular/router/ - person Stephen; 23.08.2016
comment
Свойство «маршрутизатор» не существует для типа «Вашкомпонент» - person Toolkit; 05.12.2016
comment
Я в замешательстве. «ВашКомпонент» нигде в этом ответе не существует. - person Stephen; 07.12.2016

Это сработало для меня (начиная с Angular 2.1.0):

constructor(private route: ActivatedRoute) {}
ngOnInit() {
  // Capture the token  if available
  this.sessionId = this.route.snapshot.queryParams['token']

}
person brando    schedule 05.11.2016
comment
На мой взгляд, все ответы выше этого полны ошибок. Это правильный. - person Striped; 19.05.2017

(только для детского маршрута, такого как /hello-world)

В случае, если вы хотите сделать такой вызов:

/hello-world?foo=bar&fruit=banana

Angular2 использует не ? и не &, а ;. Таким образом, правильный URL должен быть:

/hello-world;foo=bar;fruit=banana

И чтобы получить эти данные:

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

private foo: string;
private fruit: string;

constructor(
  private route: ActivatedRoute,
  private router: Router
  ) {}

ngOnInit() {
  this.route.params.forEach((params: Params) => {
      this.foo = params['foo'];
      this.fruit = params['fruit'];
  });
  console.log(this.foo, this.fruit); // you should get your parameters here
}

Источник: https://angular.io/docs/ts/latest/guide/router.html

person Wetteren Rémi    schedule 26.09.2016
comment
Angular2 использует ; (синтаксис параметра матрицы) для параметров запроса дочерних маршрутов и ? для параметров запроса корневого маршрута. - person Günter Zöchbauer; 26.09.2016
comment
Я пытаюсь запустить его так и получаю следующее при запуске npm: aot/app/app.component.ngfactory.ts(45,30): ошибка TS2346: предоставленные параметры не соответствуют ни одной подписи цели вызова. - person jjj; 04.10.2016

Angular2 v2.1.0 (стабильная версия):

ActivatedRoute предоставляет наблюдаемый, на который можно подписаться.

  constructor(
     private route: ActivatedRoute
  ) { }

  this.route.params.subscribe(params => {
     let value = params[key];
  });

Это также срабатывает каждый раз при обновлении маршрута: /home/files/123 -> /home/files/321.

person marcel    schedule 21.11.2016
comment
для angular 4 немного отличается, и это пусть значение = params.key - person Amir; 07.06.2017

Простой способ сделать это в Angular 7+:

Определите путь в вашем ?-routing.module.ts

{ path: '/yourpage', component: component-name }

Импортируйте модуль ActivateRoute и Router в свой компонент и внедрите их в конструктор.

contructor(private route: ActivateRoute, private router: Router){ ... }

Подпишите ActivateRoute на ngOnInit

ngOnInit() {

    this.route.queryParams.subscribe(params => {
      console.log(params);
      // {page: '2' }
    })
}

Предоставьте его по ссылке:

<a [routerLink]="['/yourpage']" [queryParams]="{ page: 2 }">2</a>
person Fortedx    schedule 19.08.2019

Угловой 4:

Я включил версии JS (для OG) и TS ниже.

.html

<a [routerLink]="['/search', { tag: 'fish' } ]">A link</a>

В приведенном выше примере я использую массив параметров ссылок. Дополнительные сведения см. в приведенных ниже источниках.

routing.js

(function(app) {
    app.routing = ng.router.RouterModule.forRoot([
        { path: '', component: indexComponent },
        { path: 'search', component: searchComponent }
    ]);
})(window.app || (window.app = {}));

searchComponent.js

(function(app) {
    app.searchComponent =
        ng.core.Component({
            selector: 'search',
                templateUrl: 'view/search.html'
            })
            .Class({
                constructor: [ ng.router.Router, ng.router.ActivatedRoute, function(router, activatedRoute) {
                // Pull out the params with activatedRoute...
                console.log(' params', activatedRoute.snapshot.params);
                // Object {tag: "fish"}
            }]
        }
    });
})(window.app || (window.app = {}));

routing.ts (отрывок)

const appRoutes: Routes = [
  { path: '', component: IndexComponent },
  { path: 'search', component: SearchComponent }
];
@NgModule({
  imports: [
    RouterModule.forRoot(appRoutes)
    // other imports here
  ],
  ...
})
export class AppModule { }

searchComponent.ts

import 'rxjs/add/operator/switchMap';
import { OnInit } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router';

export class SearchComponent implements OnInit {

constructor(
   private route: ActivatedRoute,
   private router: Router
) {}
ngOnInit() {
    this.route.params
      .switchMap((params: Params) => doSomething(params['tag']))
 }

Дополнительная информация:

Массив параметров ссылки https://angular.io/docs/ts/latest/guide/router.html#!#link-parameters-array

Activated Route — универсальный магазин информации о маршруте https://angular.io/docs/ts/latest/guide/router.html#!#activated-route

person Ally    schedule 26.05.2017

Для Angular 4

Ссылка:

http://example.com/company/100

Путь к маршрутизатору:

const routes: Routes = [
  { path: 'company/:companyId', component: CompanyDetailsComponent},

]

Компонент:

@Component({
  selector: 'company-details',
  templateUrl: './company.details.component.html',
  styleUrls: ['./company.component.css']
})
export class CompanyDetailsComponent{
   companyId: string;

   constructor(private router: Router, private route: ActivatedRoute) {
          this.route.params.subscribe(params => {
          this.companyId = params.companyId;
          console.log('companyId :'+this.companyId);
     }); 
  }
}

Вывод в консоль:

идентификатор компании: 100

person Amir    schedule 07.06.2017

Согласно документации Angular2, вы должны использовать:

@RouteConfig([
   {path: '/login/:token', name: 'Login', component: LoginComponent},
])

@Component({ template: 'login: {{token}}' })
class LoginComponent{
   token: string;
   constructor(params: RouteParams) {
      this.token = params.get('token');
   }
}
person suvroc    schedule 04.01.2016
comment
Вы ошиблись из документов. (Неправильное имя поля) может захотеть это исправить. - person Benjamin Gruenbaum; 04.01.2016
comment
Это решение делает :token необязательным. - person 0xcaff; 21.06.2016
comment
404 по этой ссылке на документ - person Beanwah; 01.08.2016
comment
Старый ответ из предварительного выпуска. RouteParams устарел (поэтому документ 404) - person Purrell; 19.09.2016
comment
Ссылка на документацию для ActivatedRoute: angular.io/docs/ts /последний/API/маршрутизатор/индекс/ - person mkaj; 28.09.2016

Обновление Angular 5+

route.snapshot предоставляет начальное значение карты параметров маршрута. Вы можете получить доступ к параметрам напрямую, без подписки или добавления наблюдаемых операторов. Гораздо проще писать и читать:

Цитата из документов Angular

Чтобы разобрать это для вас, вот как это сделать с новым маршрутизатором:

this.router.navigate(['/login'], { queryParams: { token:'1234'} });

А затем в компоненте входа (обратите внимание на добавление нового .snapshot):

constructor(private route: ActivatedRoute) {}
ngOnInit() {
    this.sessionId = this.route.snapshot.queryParams['token']

}
person Kyle Krzeski    schedule 22.08.2018

В Angular 6 я нашел более простой способ:

navigate(["/yourpage", { "someParamName": "paramValue"}]);

Затем в конструкторе или в ngInit вы можете напрямую использовать:

let value = this.route.snapshot.params.someParamName;
person Andrew    schedule 23.03.2019