Як отримати параметр з url в кутовій 4?


78

Я намагаюся отримати дату початку з URL-адреси. URL-адреса виглядає такhttp://sitename/booking?startdate=28-08-2017

Мій код нижче:

aap.module.ts

    import {...};

    @NgModule({
      declarations: [
        AppComponent, ModalComponent
      ],
      imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        JsonpModule,
        ReactiveFormsModule,
        RouterModule.forRoot([{
                path: '',
                component: AppComponent
            },
        ]),    
      ], 
      providers: [ContactService, AddonService, MainService],
      bootstrap: [AppComponent]
    })
    export class AppModule { }

aap.component.ts

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

constructor(private activatedRoute: ActivatedRoute) {
  // subscribe to router event
  this.activatedRoute.queryParams.subscribe((params: Params) => {
    console.log(params);
  });

}

Але це дає нижче помилку

Невідпрацьоване відхилення обіцянки: Не встановлено базовий href. Введіть значення для маркера APP_BASE_HREF або додайте базовий елемент до документа. ; Зона:; Завдання: Promise.then; Значення: Помилка: Не встановлено базовий href. Введіть значення для маркера APP_BASE_HREF або додайте базовий елемент до документа.

Звідки Angular знає базовий href?


Відповіді:


129

Це має зробити фокус, отримуючи параметри з URL-адреси:

constructor(private activatedRoute: ActivatedRoute) {
  this.activatedRoute.queryParams.subscribe(params => {
        let date = params['startdate'];
        console.log(date); // Print the parameter to the console. 
    });
}

Дата локальної змінної тепер повинна містити параметр startdate із URL-адреси. Модулі Router і Params можна видалити (якщо вони не використовуються десь у класі).


ця відповідь є роботою, але чому після оновлення сторінки, яка має параметр url, сторінка стане порожньою?
Фай Зал Донг

Важко сказати. Перше, що мені спадає на думку, це те, що ви, можливо, переходите в розділ ngOnInit коду машинопису, не вказуючи жодних параметрів? Тоді він, природно, повернеться до компонента без будь-яких параметрів.
Ержан

Привіт @Curiosity_is_Learning Я намагаюся встановити параметри запиту як глобальну змінну. Наразі з цією логікою "дата" доступна лише в рамках цього методу підписки, так? Як зберегти ці параметри запиту як глобальну змінну. Я спробував let.date = ['startdate'], але при виклику його де-небудь поза методом передплати він не визначений.
Джессі

привіт @ Джессі, це має бути досить просто. Просто оголосити змінну у верхній частині компоненти Anulgar як це: private startDate: string;то ви повинні бути в змозі замінити let date = params['startdate'];з this.startDate = params['startdate'];. Тоді ви можете повторно використовувати змінну в іншому місці компонента скільки завгодно, просто зателефонувавшиthis.startDate
Ørjan

@Curiosity_is_Learning Це саме те, що я зробив, але одного разу я викликаю "this.startDate" поза методом передплати. Значення не визначено. Усередині методу передплати "this.startDate" виводить відповідну дату.
Джессі

159

Маршрути

export const MyRoutes: Routes = [
    { path: '/items/:id', component: MyComponent }
]

Компонент

import { ActivatedRoute } from '@angular/router';
public id: string;

constructor(private route: ActivatedRoute) {}

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

13
Ця відповідь працює краще, ніж прийнята в моєму випадку. Дякую!
Бен,

Якщо я хочу надіслати один об’єкт і не хочу показувати це в url, то що я можу зробити?
Анудж

@Anuj Use service
Дмитро Гринько

Моя Вимога не така, я хочу клацнути на одній таблиці і надіслати ці дані таблиці на іншу сторінку, яка має 4-5 полів.
Анудж,

1
@Anuj так, ви можете використовувати сервіс для цього. onClick (рядок: будь-який) {this.shareService.setData (рядок); this.router.navigate (['/ page2'])} і на вашій сторінці2 ви можете отримати ці дані ngOnInit () {const data = this.shareService.getData (); } Сподіваюся, це допоможе
Дмитро Гринько

19
constructor(private activatedRoute: ActivatedRoute) {
}

ngOnInit() {
    this.activatedRoute.params.subscribe(paramsId => {
        this.id = paramsId.id;
        console.log(this.id);
    });
  
 }

4
На мою думку, це найкраща відповідь для кутових 5. Дякую!
Об’єднайте

1
Неможливо розпізнати спостережуваний на наступному фреймі eventloop з невизначеним у консолі?
vp_arth

Це дає мені "невизначеність"
Сара

Це також дає мені "невизначений". З якоїсь причини я підозрюю, що ця проблема відбувається на "ngOnInit". Коли я створив інший метод і виконав (console.log (this.id), я бачу належні дані. Але маючи console.log саме там, де ви це маєте у своїй відповіді; я отримав невизначений у консолі.
Джессі

Я відредагував це, мій поганий: D, це дало вам невизначеність, тому що на момент, коли стався журнал консолі, дані від передплати не надходили. (Не робіть так: D, я тоді був початківцем), щоб перевірити значення, спробуйте помістити його в ту ж область функцій.
Теодор

11

У кутовому вигляді вони розділяють його на 2 види url.

  1. Шаблон URL-адреси /heroes/:limit. Приклад:/heroes/20

    • Ви можете отримати необроблену вартість за допомогою route.snapshot.paramMap.get.
    • Підпишіться на, route.paramMapщоб отримати параметри
  2. Шаблон URL-адреси /heroes. Приклад:/heroes?limit=20

    • Ви можете отримати необроблену вартість за допомогою route.snapshot.queryParamMap

Довідково: Все, що вам потрібно знати про кутові параметри


6

Прийнята відповідь використовує спостережуване для отримання параметра, який може бути корисним у параметрі, зміниться за весь життєвий цикл компонента.

Якщо параметр не зміниться, можна розглянути можливість використання об’єкта params на знімку URL-адреси маршрутизатора.

snapshot.params повертає всі параметри в URL-адресі в об'єкті.

constructor(private route: ActivateRoute){}

ngOnInit() {
   const allParams = this.route.snapshot.params // allParams is an object
   const param1 = allParams.param1 // retrieve the parameter "param1"
}

4

Перевірте параметри з рядка URL-адреси або як :paramу вашому routeConfig

downstream.component.ts

...
import {Router,ActivatedRoute} from '@angular/router';
...    
export class DownstreamComponent  {
    constructor(
    private route: ActivatedRoute,
    private router: Router
) {
    if(this.route.snapshot.queryParams) 
      console.log(this.route.snapshot.params); // e.g. :param1 in routeConfig
    if(this.route.snapshot.queryParamMap.get('param1'))
      console.log(this.route.snapshot.queryParamMap.get('param1')); // e.g. in URI ?param1=blah
}

}


2

використання paramMap

Це забезпечить назви параметрів та їх значення

//http://localhost:4200/categories/1
//{ path: 'categories/:category', component: CategoryComponent },

import { ActivatedRoute } from '@angular/router';

constructor(private route: ActivatedRoute) { }

ngOnInit() {

  this.route.paramMap.subscribe(params => {
        console.log(params)
  })
}

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

constructor(private activatedRoute: ActivatedRoute) { }

  ngOnInit() {
    this.activatedRoute.paramMap
    .subscribe( params => {
    let id = +params.get('id');
    console.log('id' + id);
    console.log(params);


id12
ParamsAsMap {params: {…}}
keys: Array(1)
0: "id"
length: 1
__proto__: Array(0)
params:
id: "12"
__proto__: Object
__proto__: Object
        }
        )

      }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.