Xử lý giỏ hàng dùng Angular

Xử lý giỏ hàng dùng Angular hướng dẫn tạo nút thêm vào giò, lưu sản phẩm vào giỏ hàng,, hiện giỏ hàng, tính tông tiền, tổng số lượng…


Yêu cầu

  • Thêm nút Thêm vào giỏ trong các chức năng sản phẩm bán chạy, sản phẩm mới, sản phẩm chi tiết
  • Ghi nhận sản phẩm trong giỏ hàng,
  • Hiện giỏ hàng, tính thành tiền, tổng tiền, xóa sản phẩm, nút lưu đơn hàng
  • Trước khi thực hiện bài này, hãy xem và thực hiện theo bài này:
    https://longnv.name.vn/thuc-tap-angular/hien-chi-tiet-san-pham-dung-angular

Chuẩn bị

  1. Vào folder project chạy lệnh 
    ng serve -o để chạy project
  2. Vào folder project chạy lệnh 
    json-server -w db.json

Tạo interface cart

Chúng ta tạo interface để khai báo thông tin của từng sản phẩm lưu trong giỏ hàng

  1. Chạy lệnh sau trong folder project: ng g i ICart
  2. Mở file icart.ts mới tạo và khai báo thông tin của từng sản phầm trong giỏ hàng
export interface ICart {
    idsp:number;
    tensp:string;
    giasp:number;
    soluong:number;
    hinh:string;
}

Tạo service cart để xử lý giỏ hàng

  1. Chạy lệnh sau trong folder project : ng g s Cart
  2. Mở file cart.service.ts mới tạo và code:
  • Nhúng  interface ISanpham và ICart , HttpClient
  • Khai báo biến items chứa các sản phẩm được chọn
  • Định nghĩa các hàm addToCart, getItems, clearCart
//cart.service.ts
import { Injectable } from '@angular/core';
import { ISanpham } from './isanpham';
import { ICart } from './icart';
import { HttpClient } from '@angular/common/http';
@Injectable({ providedIn: 'root'})
export class CartService {
  constructor(  private h:HttpClient ) { }
  items: ICart[] = [];
  addToCart(sp: ISanpham) {    
    var c:ICart;
    c = { 
      idsp: sp.id, 
      tensp: sp.tensp, 
      giasp: sp.giasp, 
      hinh: sp.hinh, 
      soluong:1 
    }
    this.items.push(c); 
  }
  getItems() { return this.items; }
  clearCart() { this.items = []; return this.items;}
}

Chức năng Thêm vào giỏ

1. Thêm nút vào component sản phẩm bán chạy

a. Code tạo button và gọi hàm: mở file san-pham-ban-chay.compoment.html

b. Định nghĩa hàm trong component  

  • Mở file san-pham-ban-chay.component.ts
  • Nhúng service cart và định nghĩa hàm addToCart gọi đến hàm trong service

c. Test

2. Tăng số lượng khi chọn sản phẩm nhiều lần

Mở cart.service.ts và code để được như sau:

3. Thêm nút vào component sản phẩm mới

Thực hiện tương tự vừa mới làm với sản phẩm bán chạy

4. Thêm nút vào component sản phẩm theo loại

Thực hiện tương tự vừa mới làm với sản phẩm bán chạy

5. Thêm nút vào component sản phẩm chi tiết

Thực hiện tương tự vừa mới làm với sản phẩm bán chạy

Table trên server để lưu donhang

Mở file db.json và code thêm để định nghĩa 2 bảng donhang và donhangchitiet

Hiện giỏ hàng , tính toán, xóa giỏ hàng, xóa sản phẩm

1. Tạo component

Chạy lệnh ng g c Cart

2. Tạo routing cho component

– Mở file app-routing.module.ts và định nghĩa path cart  trong mục routes:

– Mở app.component.html và code để tạo link đến route cart

– Test:

3. Code trong component cart

  • Nhúng cart serice  để gọi hàm trong đó (biến cartService)
  • Định nghĩa hàm tongtien và tongsoluong để hiện trong view
  • Lấy các items trong giỏ hàng và component để hiện ra view

Thưc hiện code:

4. Nhúng formModule vào project

Vì trong view sắp code có dùng lệnh ngModel cho nên cần nhúng FormModule vào project. Thực hiện bằng cách mở app.module.ts và khai báo:

5. Trình bày dữ liệu trong view

Sử dụng table của bootstrap 5: https://getbootstrap.com/docs/5.3/content/tables/

<!-- cart.compoment.html -->
<div class="alert alert-warning text-center p-5 h2" *ngIf="items.length==0" >
  Bạn chưa chọn sản phẩm nào
</div>
<table id="cart" class="table table-bordered" *ngIf="items.length>0" >
  <caption align="top" class="h3">GIỎ HÀNG CỦA BẠN</caption>
  <tr> <th>Tên sản phẩm</th> <th>Giá </th> <th>Số lượng</th>  <th>Thành tiền </th> </tr>
  <tr *ngFor="let item of items" >
   <td> {{ item.tensp |uppercase }}</td>
   <td> {{item.giasp |number:'1.0-0':'fr' }} VNĐ</td>
   <td><input [(ngModel)]="item.soluong" min="1" type="number" class="form-control"> </td>
   <td> {{item.giasp*item.soluong |number:'1.0-0':'fr' }} VNĐ </td>
  </tr>
  <tr> 
   <th colspan="2"> Tổng số lượng: {{ tongsoluong() }} </th>
   <th colspan="2"> Tổng tiền: {{ tongtien() |number:'1.0-0':'fr'}} VNĐ  </th>
  </tr>
  <tr> 
   <td colspan="2"> </td>
   <td colspan="2"> <a class="btn btn-warning w-100" href="#">Thanh toán</a> </td>
  </tr>
</table>

Xem thử kết quả

6. Xóa giỏ hàng và xóa sản phẩm

Thên 2 nút vào view và viết code: bạn thực hiện nhé

Xử lý giỏ hàng dùng Angular là dễ phải không nào. Angular hỗ trợ phần nhiều, chúng ta chỉ code chút xíu là xong thôi.


Sau đây là các bài trong seris thực tập Angular bạn cần thực hiện tuần tự từ trên xuống để có project nhé:

  1. Đôi điều về Angular – P1
  2. Đôi điều về Angular – P2
  3. Hiện sản phẩm bán chạy
  4. Hiện sản phẩm mới dùng Angular
  5. Hiện loại sản phẩm dùng Angular
  6. Hiện sản phẩm theo loại dùng Angular
  7. Hiện chi tiết sản phẩm dùng Angular