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-detailsen 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/:productIdetProductDetailsComponentpour 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
routerLinkavec leproduct.idcomme 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, importezActivatedRoutedepuis@angular/routeret le tableauproductsdepuis../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
ActivatedRoutedans leconstructor()en ajoutantprivate route: ActivatedRoutecomme 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 leproductIddes 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
ProductDetailsComponentpour 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.