hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Cấu trúc dữ liệu và giải thuật
    • Lập Trình C# Cơ Bản
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Angular
  • Học lập trình
  • Lập trình Javascript
Guards and Resolvers (Phần 2)

Guards and Resolvers (Phần 2)

  • 14-01-2024
  • Toanngo92
  • 0 Comments

Mục lục

  • Route Guards
  • CanDeactivate
  • CanLoad

Route Guards

Route Guards là những bảo vệ đường dẫn giúp quyết định liệu chúng ta có thể chuyển hướng đến một URL cụ thể hay không. Nếu tất cả các guard đều trả về true, quá trình chuyển hướng sẽ tiếp tục. Nếu có bất kỳ guard nào trả về false, quá trình chuyển hướng sẽ bị hủy. Nếu một guard trả về một UrlTree, chuyển hướng hiện tại sẽ bị hủy và một chuyển hướng mới sẽ được bắt đầu đến UrlTree mà guard đã trả về.

Angular Router cung cấp một số loại guard để xử lý các tình huống khác nhau:

  1. CanActivate (Kích hoạt components):
    • canActivate: Kiểm tra xem có thể kích hoạt route hiện tại hay không.
  2. CanActivateChild (Kích hoạt components con):
    • canActivateChild: Kiểm tra xem có thể kích hoạt các components con của route hiện tại hay không.
  3. CanDeactivate (Hủy kích hoạt components):
    • canDeactivate: Kiểm tra xem có thể hủy kích hoạt route hiện tại hay không. Thường được sử dụng để kiểm tra trước khi rời khỏi một trang, ví dụ như khi người dùng đang chỉnh sửa một mục và muốn xác nhận rằng họ muốn rời khỏi trang.
  4. CanLoad (Load children – Tải components lazy loading):
    • canLoad: Kiểm tra xem có thể tải các components lazy loading hay không, trước khi chúng được tải. Thường được sử dụng để kiểm soát việc tải các modules lười biếng (lazy-loaded modules).

Chẳng hạn, trong bài viết ngày 30, chúng ta đã tìm hiểu về CanActivate để kiểm tra xem có thể kích hoạt các components hay không. Còn khi chúng ta muốn kiểm tra xem có được phép hủy kích hoạt (deactivate) các components hay không, chúng ta có thể sử dụng CanDeactivate.

CanDeactivate

Giả sử chúng ta đang có chức năng chỉnh sửa bài viết và khách hàng yêu cầu thêm một tính năng mới: khi người dùng đã thay đổi thông tin mà chưa lưu lại và muốn chuyển sang một trang khác, hệ thống sẽ hỏi xác nhận từ người dùng liệu họ thực sự muốn rời khỏi trang hay không.

Trong tình huống này, chúng ta có thể sử dụng CanDeactivate guard để kiểm tra trước khi hủy kích hoạt (deactivate) một component, tức là kiểm tra xem người dùng có thể rời khỏi trang chỉnh sửa bài viết hay không.

Bắt đầu bằng cách thêm một service và triển khai CanDeactivate guard như sau:

import { Injectable } from "@angular/core";
import {
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  CanDeactivate,
  UrlTree,
} from "@angular/router";
import { Observable } from "rxjs";
import { ArticleEditComponent } from "./article-edit/article-edit.component";

@Injectable({
  providedIn: "root",
})
export class CanLeaveEditGuard
  implements CanDeactivate<ArticleEditComponent>
{
  canDeactivate(
    component: ArticleEditComponent,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree {
    return !component.isEditing; // Replace with actual logic
  }
}

Sau đó, chúng ta thêm guard vào cấu hình routing như sau:

const routes: Routes = [
  {
    path: "article",
    component: ArticleComponent,
    children: [
      // Các cấu hình khác
      {
        path: ":slug/edit",
        component: ArticleEditComponent,
        canActivate: [CanEditArticleGuard],
        canDeactivate: [CanLeaveEditGuard], // Đây là một mảng, có thể có nhiều guards
      },
    ],
  },
];

Khi người dùng thực hiện chuyển hướng ra khỏi màn hình chỉnh sửa, Angular Router sẽ thực thi CanLeaveEditGuard.canDeactivate. Chúng ta có thể kiểm tra các điều kiện cần thiết để quyết định liệu có thể chuyển hướng hay không.

Để tăng khả năng sử dụng lại của guard, chúng ta có thể sử dụng một interface như sau:

export interface CheckDeactivate {
  checkDeactivate(
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree;
}

Sau đó, component sẽ chịu trách nhiệm triển khai logic như sau:

@Injectable({
  providedIn: "root",
})
export class CanLeaveEditGuard
  implements CanDeactivate<CheckDeactivate>
{
  canDeactivate(
    component: CheckDeactivate,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree {
    return component.checkDeactivate(currentRoute, currentState, nextState);
  }
}

Với cách làm này, chúng ta có thể kiểm tra điều kiện và hiển thị một hộp thoại xác nhận để hỏi người dùng liệu họ thực sự muốn rời khỏi trang hay không.

CanLoad

Đối với các lazy load route, chúng ta có thể kiểm tra trước tại phía frontend để xác định liệu có thể tải trang đó về hay không, dựa trên điều kiện nào đó. Một ví dụ thực tế có thể là ứng dụng của chúng ta có một phần quản lý dành cho admin. Đối với người dùng thông thường, không cần thiết phải tải toàn bộ mã nguồn của route /admin về. Lúc này, CanLoad sẽ trở thành một guard hữu ích để chúng ta sử dụng.

Dưới đây là một ví dụ với CanLoad guard:

import { Injectable } from "@angular/core";
import {
  CanLoad,
  UrlSegment,
  Route,
  RouterStateSnapshot,
  UrlTree,
} from "@angular/router";
import { Observable } from "rxjs";

@Injectable({
  providedIn: "root",
})
export class CanLoadAdminGuard implements CanLoad {
  canLoad(
    route: Route,
    segments: UrlSegment[]
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree {
    return true; // Replace with actual logic
  }
}

Và khi cấu hình routing, chúng ta sử dụng CanLoad guard như sau:

const routes: Routes = [
  {
    path: "admin",
    loadChildren: () =>
      import("./admin/admin.module").then((m) => m.AdminModule),
    canLoad: [CanLoadAdminGuard], // Đây là một mảng, có thể có nhiều guards
  },
  {
    path: "",
    redirectTo: "article",
    pathMatch: "full",
  },
];

Trong ví dụ này, chúng ta có thể triển khai các logic kiểm tra để xem liệu người dùng có quyền admin hay không. Ví dụ:

@Injectable({
  providedIn: "root",
})
export class CanLoadAdminGuard implements CanLoad {
  constructor(private userService: UserService) {}

  canLoad(
    route: Route,
    segments: UrlSegment[]
  ):
    | Observable<boolean | UrlTree>
    | Promise<boolean | UrlTree>
    | boolean
    | UrlTree {
    return this.userService.currentUser.isAdmin; // Replace with actual logic
  }
}

Guard sẽ kiểm tra xem người dùng có quyền admin hay không, và dựa vào kết quả, quyết định liệu route /admin sẽ được tải về hay không.

Bài viết liên quan:

Sắp xếp sủi bọt – Bubble Sort
TypeScript với Kiểu Dữ Liệu Cơ Bản – 3
TypeScript với Kiểu Dữ Liệu Cơ Bản – 2
TypeScript với Kiểu Dữ Liệu Cơ Bản – 1
Typescript cơ bản và cách cài đặt cho người mới
Thực Hành Micro Frontends
Dynamic Component trong Angular
Async Validator trong Angular Form
Reactive Forms Trong Angular (Phần 2)
Reactive Forms Trong Angular (Phần 1)
Template-driven Forms Trong Angular (Phần 2)
Template-driven Forms Trong Angular (Phần 1)

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

4. KIỂM THỬ VÀ TRIỂN KHAI HỆ THỐNG

2. PHÂN TÍCH VÀ ĐẶC TẢ HỆ THỐNG

5. VIẾT BÁO CÁO VÀ THUYẾT TRÌNH DỰ ÁN

3. THIẾT KẾ HỆ THỐNG

1. TỔNG QUAN KIẾN THỨC THỰC HÀNH TRIỂN KHAI DỰ ÁN CÔNG NGHỆ THÔNG TIN

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×