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 3)

Guards and Resolvers (Phần 3)

  • 14-01-2024
  • Toanngo92
  • 0 Comments

Route Resolvers

Sau khi các Route Guards đã chạy và đã vượt qua được các guards này, thì đến lượt Route Resolvers được kích hoạt. Thông thường, đây là nơi mà chúng ta có thể chuẩn bị trước dữ liệu để sử dụng trong component sẽ được activate.

Liệu có cần sử dụng Resolvers không?

Thường thì, chúng ta có thể tiếp cận component trước và từ ngOnInit, chúng ta có thể thực hiện các bước để lấy dữ liệu cần thiết cho component đó. Ví dụ, trong component ArticleDetailComponent, chúng ta có thể làm như sau:

export class ArticleDetailComponent implements OnInit {
  article$: Observable<Article>;

  constructor(private _route: ActivatedRoute, private _api: ArticleService) {}

  ngOnInit(): void {
    this.article$ = this._route.paramMap.pipe(
      map((params) => params.get("slug")),
      switchMap((slug) => this._api.getArticleBySlug(slug))
    );
  }
}

Chính xác, khi component được kích hoạt, chúng ta thực hiện kết nối đến nguồn dữ liệu để lấy thông tin. Trong nhiều trường hợp, quá trình này là bất đồng bộ, như đã thấy ở trên.

Lúc này, chúng ta có thể thấy rằng chúng ta đã triển khai một chỉ báo tải để thông báo cho người dùng biết chúng ta đang lấy dữ liệu.

Resolvers là gì và tại sao lại cần chúng?

Interface mà các class có thể implement để trở thành một nhà cung cấp dữ liệu. Một class nhà cung cấp dữ liệu có thể được sử dụng với router để giải quyết dữ liệu trong quá trình điều hướng. Interface định nghĩa một phương thức resolve() sẽ được gọi khi điều hướng bắt đầu. Router sau đó sẽ chờ cho đến khi dữ liệu được giải quyết trước khi route cuối cùng được kích hoạt.

interface Resolve<T> {
  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<T> | Promise<T> | T;
}

Resolver chỉ là một dạng của service, đã triển khai interface Resolve. Các Resolvers sẽ thực thi hàm resolve và Router sẽ chờ đến khi dữ liệu được giải quyết trước khi activate components.

Ví dụ, chúng ta có thể tạo một Resolver để lấy thông tin về một Article như sau:

@Injectable({
  providedIn: "root",
})
export class ArticleResolver implements Resolve<Article> {
  constructor(private articleService: ArticleService) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<Article> | Promise<Article> | Article {
    const slug = route.paramMap.get("slug");
    return this.articleService.getArticleBySlug(slug);
  }
}

Sau đó, trong cấu hình routing của chi tiết bài viết, chúng ta thêm một khóa mới:

const routes: Routes = [
  {
    path: "article",
    component: ArticleComponent,
    children: [
      {
        path: "",
        component: ArticleListComponent,
      },
      {
        path: ":slug",
        component: ArticleDetailComponent,
        resolve: {
          article: ArticleResolver,
        },
      },
    ],
  },
];

Cuối cùng, chúng ta thay đổi component để lấy dữ liệu từ thuộc tính data:

export class ArticleDetailComponent implements OnInit {
  article$: Observable<Article>;

  constructor(private _route: ActivatedRoute, private _api: ArticleService) {}

  ngOnInit(): void {
    this.article$ = this._route.data.pipe(map((data) => data.article));
  }
}

Bây giờ, khi chúng ta thực hiện thử nghiệm, thay vì hiển thị chỉ báo tải trong component, chúng ta đã lấy dữ liệu trước khi activate component. Do đó, sau khi điều hướng, Resolver phải hoàn thành giải quyết và chúng ta mới thấy component được render ra màn hình. Do đó, không còn hiển thị chỉ báo tải nữa.

Lưu ý:

  • Nếu Resolver không giải quyết được, bạn sẽ không thể nhìn thấy component của mình được render.
  • Không nên chia sẻ giữa nhiều Resolvers với nhau.
  • Đối với các luồng trả về nhiều giá trị, bạn không nên sử dụng cho Resolvers, ví dụ như WebSocket.

Trong quan điểm của mình, Resolvers nên chỉ được sử dụng để lấy một phần dữ liệu, sau đó component có thể thực hiện các kết nối khác.

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

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

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

Hướng dẫn tự cài đặt n8n comunity trên CyberPanel, trỏ tên miền

Mẫu prompt tạo mô tả chi tiết bối cảnh

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
×