Partie 3 - Gestion des données
Cette étape du tutoriel vous guide dans la création d'un panier d'achat en suivant les phases suivantes :
- Mettre à jour la vue des détails du produit pour inclure un bouton Acheter , qui ajoute le produit actuel à une liste de produits gérés par un service de panier
- Ajoutez un composant de panier,qui affiche les articles dans le panier.
- Ajoutez un composant d'expédition, qui récupère les prix d'expédition pour les articles dans le panier en utilisant
HttpClientd'Angular pour récupérer les données d'expédition à partir d'un fichier.json
Créer le service de panier d'achat
Dans Angular, un service est une instance d'une classe que vous pouvez mettre à la disposition de n'importe quelle partie de votre application à l'aide du système d'injection de dépendances d'Angular.
Actuellement,les utilisateurs peuvent consulter des informations sur les produits,et l'application peut simuler le partage et les notifications concernant les changements de produits.
L'étape suivante consiste à créer un moyen pour les utilisateurs d'ajouter des produits à un panier. Cette section vous guide à travers l'ajout d'un bouton Acheter et la configuration d'un service de panier pour stocker des informations sur les produits dans le panier.
Définir un service de panier
Cette section vous CartService dans la création du CartService qui suit les produits ajoutés au panier.
- Dans le terminal, générez un nouveau service de cart en exécutant la commande suivante :
ng generate service cart
- Importez l' interface
Productde./products.tsdans le fichiercart.service.tset dans la classeCartService, définissez une propriétéitemspour stocker le tableau des produits actuels dans le panier.
import { Product } from "./products";
import { Injectable } from "@angular/core";
/* . . . */
@Injectable({
providedIn: "root",
})
export class CartService {
items: Product[] = [];
/* . . . */
}
- Définissez des méthodes pour ajouter des articles au panier, renvoyer les articles du panier et effacer les articles du panier.
@Injectable({
providedIn: "root",
})
export class CartService {
items: Product[] = [];
/* . . . */
addToCart(product: Product) {
this.items.push(product);
}
getItems() {
return this.items;
}
clearCart() {
this.items = [];
return this.items;
}
/* . . . */
}
- La méthode
addToCart()ajoute un produit à un tableau d'items - La méthode
getItems()collecte les articles que les utilisateurs ajoutent au panier et renvoie chaque article avec sa quantité associée - La méthode
clearCart()renvoie un tableau vide d'éléments, qui vide le panier
Utiliser le service de panier
Cette section vous aide à utiliser CartService pour ajouter un produit au panier.
- Dans
product-details.component.ts, importez le service de panier.
import { Component, OnInit } from "@angular/core";
import { ActivatedRoute } from "@angular/router";
import { Product, products } from "../products";
import { CartService } from "../cart.service";
- Injectez le service cart en l'ajoutant au
constructor().
export class ProductDetailsComponent implements OnInit {
constructor(
private route: ActivatedRoute,
private cartService: CartService
) {}
}
- Définissez la méthode
addToCart(), qui ajoute le produit actuel au panier.
export class ProductDetailsComponent implements OnInit {
/* . . . */
addToCart(product: Product) {
this.cartService.addToCart(product);
window.alert("Votre produit a été ajouté au panier!");
}
}
La méthode addToCart() effectue les opérations suivantes :
- Prend le product courant comme argument
- Utilise la CartService
addToCart()pour ajouter le produit au panier - Affiche un message indiquant que vous avez ajouté un produit au panier.
- Dans
product-details.component.html, ajoutez un bouton avec le texte Acheter et liez l'événementclick()à la méthodeaddToCart(). Ce code met à jour le modèle de détails du produit avec un bouton Acheter qui ajoute le produit actuel au panier.
<h2>Détails du produit</h2>
<div *ngIf="product">
<h3>{{ product.name }}</h3>
<h4>{{ product.price | currency }}</h4>
<p>{{ product.description }}</p>
<button type="button" (click)="addToCart(product)">Acheter</button>
</div>
- Vérifiez que le nouveau bouton Acheter apparaît comme prévu en actualisant l'application et en cliquant sur le nom d'un produit pour afficher ses détails.

- Cliquez sur le bouton Acheter pour ajouter le produit à la liste des articles stockés dans le panier et afficher un message de confirmation.

Créer la vue panier
Pour que les clients puissent voir leur panier,vous pouvez créer la vue du panier en deux étapes :
- Créez un composant de panier et configurez le routage vers le nouveau composant.
- Affichez les éléments du panier.
Configurer le composant panier
Pour créer la vue du panier, suivez les mêmes étapes que pour créer le ProductDetailsComponent et configurer le routage pour le nouveau composant.
- Générez un nouveau composant nommé cart dans le terminal en exécutant la commande suivante :
ng generate component cart
Cette commande générera le fichier cart.component.ts et ses fichiers de modèles et de styles associés.
import { Component } from "@angular/core";
@Component({
selector: "app-cart",
templateUrl: "./cart.component.html",
styleUrls: ["./cart.component.css"],
})
export class CartComponent {}
- Notez que le
CartComponentnouvellement créé est ajouté aux declarations du module dansapp.module.ts.
import { CartComponent } from './cart/cart.component';
@NgModule({
declarations: [
AppComponent,
TopBarComponent,
ProductListComponent,
ProductAlertsComponent,
ProductDetailsComponent,
CartComponent,
],
/* . . . */
- Toujours dans
app.module.ts, ajoutez une route pour le composantCartComponent, avec unpathdecart.
@NgModule({
imports: [
BrowserModule,
ReactiveFormsModule,
RouterModule.forRoot([
{ path: '', component: ProductListComponent },
{ path: 'products/:productId', component: ProductDetailsComponent },
{ path: 'cart', component: CartComponent },
])
],
/* . . . */
- Mettez à jour le bouton Paiement afin qu'il soit acheminé vers l'URL
/cart. Danstop-bar.component.html, ajoutez une directiverouterLinkpointant vers/cart.
<a routerLink="/cart" class="button fancy-button">
<i class="material-icons">shopping_cart</i>Paiement
</a>
- Vérifiez que le nouveau
CartComponentfonctionne comme prévu en cliquant sur le bouton Paiement . Vous pouvez voir le texte par défaut "cart works!", et l'URL a le modèle (http://localhost:4200/cart)[http://localhost:4200/cart].

Afficher les éléments du panier
Cette section vous montre comment utiliser le service de panier pour afficher les produits dans le panier.
- Dans
cart.component.ts, importez leCartServiceà partir du fichiercart.service.ts.
import { Component } from "@angular/core";
import { CartService } from "../cart.service";
- Injectez le CartService pour que le CartComponent puisse l'utiliser en l'ajoutant au constructor() .
export class CartComponent {
constructor(private cartService: CartService) {}
}
- Définissez la propriété
itemspour stocker les produits dans le panier.
export class CartComponent {
items = this.cartService.getItems();
constructor(private cartService: CartService) {}
}
Ce code définit les éléments à l'aide de la CartService getItems() . Vous avez défini cette méthode lorsque vous avez créé cart.service.ts .
- Mettez à jour le modèle de panier avec une en-tête et utilisez une
<div>avec un*ngForpour afficher chacun des articles du panier avec son nom et son prix. Le modèleCartComponentrésultant est le suivant.
<h3>Panier</h3>
<div class="cart-item" *ngFor="let item of items">
<span>{{ item.name }}</span>
<span>{{ item.price | currency }}</span>
</div>
- Vérifiez que votre panier fonctionne comme prévu :
- Cliquez sur Mon magasin.
- Cliquez sur le nom d'un produit pour afficher ses détails.
- Cliquez sur Acheter pour ajouter le produit au panier.
- Cliquez sur Paiement pour voir le panier.

Récupérer les prix d'expédition
Les serveurs renvoient souvent des données sous la forme d'un flux. Les flux sont utiles car ils facilitent la transformation des données renvoyées et la modification de la façon dont vous demandez ces données. Angular HttpClient est un moyen intégré de récupérer des données à partir d'API externes et de les fournir à votre application sous forme de flux un peu comme la fonction fetch().
Cette section vous montre comment utiliser HttpClient pour récupérer les prix d'expédition à partir d'un fichier externe.
L'application que vous construsez pour ce tuto est livrée avec des données d'expédition prédéfinies dans le fichier assets/shipping.json. Utilisez ces données pour ajouter les prix d'expédition des articles dans le panier.
[
{
"type": "De nuit",
"price": 25.99
},
{
"type": "Livraison 2 jours",
"price": 9.99
},
{
"type": "Voie postale",
"price": 2.99
}
]
Configurer AppModule pour utiliser HttpClient
Pour utiliser le HttpClient d'Angular, vous devez configurer votre application pour utiliser HttpClientModule.
Le HttpClientModule d'Angular enregistre les fournisseurs dont votre application a besoin pour utiliser le service HttpClient dans toute votre application.
- Dans
app.module.ts, importezHttpClientModuleà partir du package@angular/common/httpen haut du fichier avec les autres importations. Comme il existe un certain nombre d'autres importations, cet extrait de code les omet par souci de concision. Assurez-vous de laisser les importations existantes en place.
import { HttpClientModule } from "@angular/common/http";
- Pour enregistrer les fournisseurs
HttpClientd'Angular globalement (pour tout les composants de l'application), ajoutezHttpClientModuleau tableau d'imports.
@NgModule({
imports: [
BrowserModule,
HttpClientModule, // <- ICI
ReactiveFormsModule,
RouterModule.forRoot([
{ path: "", component: ProductListComponent },
{ path: "products/:productId", component: ProductDetailsComponent },
{ path: "cart", component: CartComponent },
]),
],
declarations: [
AppComponent,
TopBarComponent,
ProductListComponent,
ProductAlertsComponent,
ProductDetailsComponent,
CartComponent,
],
bootstrap: [AppComponent],
})
export class AppModule {}
Configurer CartService pour utiliser HttpClient
L'étape suivante consiste à injecter le service HttpClient dans votre service afin que votre application puisse récupérer des données et interagir avec des API et des ressources externes.
- Dans
cart.service.ts, importezHttpClientà partir du package@angular/common/http.
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Product } from "./products";
- Injectez HttpClient dans le
constructor()deCartService.
export class CartService {
items: Product[] = [];
constructor(private http: HttpClient) {}
/* . . . */
}
Configurez CartService pour obtenir les prix d'expédition
Pour obtenir les données d'expédition, à partir de shipping.json, vous pouvez utiliser la méthode get() de HttpClient.
- Dans
cart.service.ts, sous la méthodeclearCart(), définissez une nouvelle méthodegetShippingPrices()qui utilise la méthodeget()deHttpClient.
export class CartService {
/* . . . */
getShippingPrices() {
return this.http.get<{ type: string; price: number }[]>(
"/assets/shipping.json"
);
}
}
Créer un composant d'expédition
Maintenant que vous avez configuré votre application pour récupérer les données d'expédition,vous pouvez créer un endroit pour afficher ces données.
- Générez un composant de panier nommé shipping dans le terminal en exécutant la commande suivante :
ng generate component shipping
Cette commande générera le fichier shipping.component.ts et les fichiers de modèles et de styles associés.
import { Component } from "@angular/core";
@Component({
selector: "app-shipping",
templateUrl: "./shipping.component.html",
styleUrls: ["./shipping.component.css"],
})
export class ShippingComponent {}
- Dans
app.module.ts, ajoutez une route pour l'expédition. Spécifiez un pathshippinget un composant deShippingComponent.
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
ReactiveFormsModule,
RouterModule.forRoot([
{ path: "", component: ProductListComponent },
{ path: "products/:productId", component: ProductDetailsComponent },
{ path: "cart", component: CartComponent },
{ path: "shipping", component: ShippingComponent },
]),
],
declarations: [
AppComponent,
TopBarComponent,
ProductListComponent,
ProductAlertsComponent,
ProductDetailsComponent,
CartComponent,
ShippingComponent,
],
bootstrap: [AppComponent],
})
export class AppModule {}
Il n'y a pas encore de lien vers le nouveau composant d'expédition, mais vous pouvez visionner ce composanten entrant l'URL spécifiée par sa route. L'URL d'affichage de ce composant est : http://localhost:4200/shipping.
Configuration du CartService ShippingComponent pour utiliser CartService
Cette section vous guide dans la modification de ShippingComponent pour récupérer les données d'expédition via HTTP à partir du fichier shipping.json.
- Dans
shipping.component.ts, importezCartService.
import { Component, OnInit } from "@angular/core";
import { Observable } from "rxjs";
import { CartService } from "../cart.service";
- Injectez le service cart dans le constructor() ShippingComponent () .
/* . . . */
constructor(private cartService: CartService) { }
/* . . . */
- Définissez une propriété
shippingCostsdont la valeur sera initialisée à l'aide de la méthodegetShippingPrices()deCartService. Initialisez la propriétéshippingCostsdans la méthodengOnInit().
export class ShippingComponent implements OnInit {
shippingCosts!: Observable<{ type: string; price: number }[]>;
constructor(private cartService: CartService) {}
ngOnInit(): void {
this.shippingCosts = this.cartService.getShippingPrices();
}
}
- Mettez à jour le modèle
ShippingComponentpour afficher les types d'expédition et les prix à l'aide d'une pipeasync.
<h3>Prix d'expédition</h3>
<div class="shipping-item" *ngFor="let shipping of shippingCosts | async">
<span>{{ shipping.type }}</span>
<span>{{ shipping.price | currency }}</span>
</div>
La pipe async renvoie la dernière valeur d'un flux de données et continue de le faire pendant toute la durée de vie d'un composant donné. Lorsque Angular détruit ce composant, la canal async s'arrête automatiquement.
- Ajoutez un lien de la vue
ShippingComponentdans la pageCartComponent.
<h3>Panier</h3>
<p>
<a routerLink="/shipping">Prix d'expédition</a>
</p>
<div class="cart-item" *ngFor="let item of items">
<span>{{ item.name }}</span>
<span>{{ item.price | currency }}</span>
</div>
- Cliquez sur le bouton Paiement pour voir le panier mis à jour. N'oubliez pas que changer l'application provoque l'actualisation de l'aperçu, ce qui vide le panier.

- Cliquez sur le lien pour accéder aux prix d'expédition.

C'est quoi la suite ?
Vous disposez maintenant d'une application de magasin avec un catalogue de produits,un panier d'achat et vous pouvez consulter les prix d'expédition.
Pour continuer à explorer Angular :
Continuez vers Formulaires pour la saisie de l'utilisateur pour terminer l'application en ajoutant la vue du panier et un formulaire de paiement.