Używanie parametrów trasy

Załóżmy, że tworzymy aplikację wyświetlającą listę produktów. Gdy użytkownik kliknie produkt na liście, chcemy wyświetlić stronę zawierającą szczegółowe informacje o tym produkcie. Aby to zrobić, musisz:

  • dodać parametr - identyfikator do trasy
  • powiązać trasę z parametrem
  • dodać usługę, która odczytuje parametr.

Deklaracja parametrów trasy

Trasa dla komponentu wyświetlającego szczegóły konkretnego produktu wymaga parametru trasy w postaci identyfikatora tego produktu. Możemy to zaimplementować za pomocą następujących Routes:

export const routes: Routes = [
  { path: '', redirectTo: 'product-list', pathMatch: 'full' },
  { path: 'product-list', component: ProductList },
  { path: 'product-details/:id', component: ProductDetails }
];

Zwróć uwagę na :id na ścieżceproduct-details, która umieszcza parametr w ścieżce. Aby na przykład wyświetlić stronę szczegółów produktu dla produktu o identyfikatorze 5, musisz użyć następującego adresu URL:
localhost:4200/szczegóły produktu/5

Powiązanie tras z parametrami

W komponencie ProductList możesz wyświetlić listę produktów. Każdy produkt ma link do trasy product-details, z identyfikatorem produktu jako parametr:

<a *ngFor="let product of products"
  [routerLink]="['/product-details', product.id]">
  {{ product.name }}
</a>

Zwróć uwagę, że dyrektywa routerLink przekazuje tablicę, która określa ścieżkę i parametr trasy. Alternatywnie mogliśmy programowo nawigować do trasy:

goToProductDetails(id) {
  this.router.navigate(['/product-details', id]);
}

Odczytywanie parametrów trasy

Składnik ProductDetails musi odczytać parametr, a następnie załadować produkt na podstawie identyfikatora podanego w parametrze.

Usługa ActivatedRoute udostępnia Observable parametry, które możemy zasubskrybować, aby uzyskać parametry trasy (patrz Observables).

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

@Component({
  selector: 'product-details',
  template: `
    <div>
      Showing product details for product: {{id}}
    </div>
  `,
})
export class LoanDetailsPage implements OnInit, OnDestroy {
  id: number;
  private sub: any;

  constructor(private route: ActivatedRoute) {}

  ngOnInit() {
    this.sub = this.route.params.subscribe(params => {
       this.id = +params['id']; // (+) converts string 'id' to a number

       // In a real app: dispatch action to load the details here.
    });
  }

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

Powodem, dla którego właściwość params wActivatedRoute jest obserwowalna, jest to że router nie może odtworzyć komponentu podczas nawigacji do tego samego komponentu. W takim przypadku parametr może ulec zmianie bez odtwarzania komponentu.

Zobacz podstawowy przykład [047]

Zobacz przykład z programową nawigacją po trasie [048]

Wyświetl przykłady działające w trybie pełnoekranowym, aby zobaczyć zmiany trasy w adresie URL.