Partie 2 - Ajouter la navigation
Associer un chemin URL à un composant
L'application utilise déjà le Router Angular pour accéder au ProductListComponent
. Cette section vous montre comment définir une route pour afficher les détails d'un seul produit.
- Générez un nouveau composant pour les détails du produit. Dans le terminal, générez un nouveau composant
product-details
en exécutant la commande suivante :
ng generate component product-details
- Dans
app.module.ts
, ajoutez une route pour les détails du produit, avec un path deproducts/:productId
etProductDetailsComponent
pour le component .
@NgModule({
imports: [
BrowserModule,
ReactiveFormsModule,
RouterModule.forRoot([
{ path: "", component: ProductListComponent },
{ path: "products/:productId", component: ProductDetailsComponent },
]),
],
declarations: [
AppComponent,
TopBarComponent,
ProductListComponent,
ProductAlertsComponent,
ProductDetailsComponent,
],
bootstrap: [AppComponent],
})
export class AppModule {}
Ouvrez product-list.component.html.
Modifiez l'ancre de nom de produit pour inclure un
routerLink
avec leproduct.id
comme paramètre.
<div *ngFor="let product of products">
<h3>
<a
[title]="'Details du ' + product.name"
[routerLink]="['/products', product.id]"
>
{{ product.name }}
</a>
</h3>
<!-- . . . -->
</div>
La directive RouterLink
vous aide à personnaliser l'élément d'ancrage. Dans ce cas, la route, ou URL, contient un segment fixe, /products
. Le segment final est variable, insérant la propriété id
du produit actuel. Par exemple, l'URL d'un produit avec un id
de 1 sera donc http://localhost:4200/products/1
.
- Vérifiez que le routeur fonctionne comme prévu en cliquant sur le nom du produit. L'application doit afficher le
ProductDetailsComponent
, qui indique actuellement "product-details works!"
Notez que l'URL dans la fenêtre d'aperçu change. Le segment final est products/#
où #
est le numéro de l'itinéraire sur lequel vous avez cliqué.

Voir les détails du produit
Le ProductDetailsComponent
gère l'affichage de chaque produit. Le routeur Angular affiche les composants en fonction de l'URL du navigateur et de vos routes définis .
Dans cette section, vous utiliserez le routeur Angular pour combiner les données des products
et les informations de route afin d'afficher les détails spécifiques de chaque produit.
- Dans
product-details.component.ts
, importezActivatedRoute
depuis@angular/router
et le tableauproducts
depuis../products
.
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Product, products } from "../products";
- Définissez la propriété du
product
.
export class ProductDetailsComponent implements OnInit {
product: Product | undefined;
/_ ... _/
}
- Injectez
ActivatedRoute
dans leconstructor()
en ajoutantprivate route: ActivatedRoute
comme argument entre les parenthèses du constructeur.
export class ProductDetailsComponent implements OnInit {
product: Product | undefined;
constructor(private route: ActivatedRoute) {}
}
ActivatedRoute
est spécifique à chaque composant chargé par le routeur Angular. ActivatedRoute
contient des informations sur la route et les paramètres de la route.
En injectant ActivatedRoute
, vous configurez le composant pour utiliser un service. La prochaine étape (Gestion des données) couvre les services plus en détail.
- Dans la méthode
ngOnInit()
, extrayez leproductId
des paramètres de route et recherchez le produit correspondant dans le tableauproducts
.
ngOnInit() {
// Récupère d'abord l'identifiant du produit de la route actuelle.
const routeParams = this.route.snapshot.paramMap;
const productIdFromRoute = Number(routeParams.get('productId'));
// Trouver le produit qui correspond à l'identifiant fourni dans route.
this.product = products.find(product => product.id === productIdFromRoute);
}
Les paramètres de route correspondent aux variables de chemin que vous définissez dans la route. Pour accéder aux paramètres de la route, nous utilisons route.snapshot
, qui est ActivatedRouteSnapshot
qui contient des informations sur la route active à ce moment particulier. L'URL qui correspond à l'itinéraire fournit le productId
. Angular utilise le productId
pour afficher les détails de chaque produit unique.
- Mettez à jour le modèle
ProductDetailsComponent
pour afficher les détails du produit avec un*ngIf
. Si un produit existe, le<div>
s'affiche avec un nom, un prix et une description.
<h2>Détails du produit</h2>
<div *ngIf="product">
<h3>{{ product.name }}</h3>
<h4>{{ product.price | currency }}</h4>
<p>{{ product.description }}</p>
</div>
La ligne,
<h4>{{ product.price | currency }}</h4>
, utilise une pipe (prononcez païpe
😉) de currency pour transformer product.price
d'un nombre en une chaîne de devise.
Une pipe est un moyen de transformer des données dans votre
modèle HTML. Lorsque les utilisateurs cliquent sur un nom dans la liste desproduits, le routeur les ProductDetailsComponent
vers l'URL distincte du produit, affiche le ProductDetailsComponent
et affiche les détails du produit.

C'est quoi la suite ?
Vous avez configuré votre application de manière à pouvoir afficher les détails des produits, chacun ayant une URL distincte et ceci de manière complètement dynamique : ici nous avons 3 produits mais cela fonctionne si nous en avions 1 000 .
Dans la prochaine section vous allez ajouter une fonctionnalité de panier d'achat, gérer les données du panier et récupérer des données externes pour les prix d'expédition.