- vừa được xem lúc

Tạo và sử dụng một structural directive trong angular 13

0 0 16

Người đăng: Gấu con

Theo Viblo Asia

Structural directives có nhiệm vụ thay đổi bố cục DOM bằng cách thêm và xóa các phần tử DOM .
DOM trong Javascript là viết tắt của chữ Document Object Model, dịch tạm ra là mô hình các đối tượng trong tài liệu HTML.
Thông qua mô hình DOM ta có thể truy xuất đến các thẻ HTML một cách dễ dàng.(Các bạn có thể tìm hiểu thêm về DOM trên mạng nhé) .
Angular đã cung cấp một tập hợp các structural directives được tích hợp sẵn (chẳng hạn như NgIf, NgForOf, NgSwitch và những thứ khác) thường được sử dụng trong tất cả các dự án Angular.
Khi các structural directives được áp dụng, chúng thường được bắt đầu bằng dấu hoa thị, * , chẳng hạn như * ngIf.

Creating a structural directive

Phần này chúng ta sẽ tạo một UnlessDirective, directive này có nhiệm vụ hiển thị hoặc ẩn một đoạn văn bản dựa vào giá trị của thuộc tính condition trong AppComponent.
UnlessDirective thì hoạt động ngược lại với NgIf và các giá trị của thuộc tính condition có thể được đặt thành true hoặc false. UnlessDirective sẽ hiển thị nội dung khi conditionfalse.

  1. Đầu tiên chúng ta sử dụng command bên dưới để tạo một structural directive với tên là unless
ng generate directive unless

2.Tiếp tục import Input, TemplateRef, và ViewContainerRef.
src/app/unless.directive.ts

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; @Directive({ selector: '[appUnless]'})
export class UnlessDirective {
}

3.Chèn TemplateRefViewContainerRef trong hàm tạo chỉ thị dưới dạng các biến private.
src/app/unless.directive.ts

constructor( private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) { }

TemplateRef giúp bạn truy cập nội dung <ng-template> và ViewContainerRef truy cập vùng chứa chế độ xem.

4.Thêm thuộc tính appUnless @Input () bằng một setter.
src/app/unless.directive.ts

@Input() set appUnless(condition: boolean) { if (!condition && !this.hasView) { this.viewContainer.createEmbeddedView(this.templateRef); this.hasView = true; } else if (condition && this.hasView) { this.viewContainer.clear(); this.hasView = false; }
}

Angular đặt thuộc tính appUnless bất cứ khi nào giá trị của điều kiện thay đổi.
- Nếu condition là false và Angular chưa tạo chế độ xem trước đó, bộ thiết lập viewContainer sẽ tạo chế độ xem nhúng(createEmbeddedView ) từ template
- Nếu condition là true và chế độ xem hiện đang được hiển thị, bộ thiết lập sẽ xóa vùng chứa, loại bỏ chế độ xem

Cập nhật code đầy đủ như sau:
src/app/unless.directive.ts

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; /** * Add the template content to the DOM unless the condition is true. */
@Directive({ selector: '[appUnless]'})
export class UnlessDirective { private hasView = false; constructor( private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) { } @Input() set appUnless(condition: boolean) { if (!condition && !this.hasView) { this.viewContainer.createEmbeddedView(this.templateRef); this.hasView = true; } else if (condition && this.hasView) { this.viewContainer.clear(); this.hasView = false; } }
}

Testing the directive

1.Cập nhật code file src/app/app.component.ts
Thêm một condition được đặt thành false trong AppComponent.

condition = false;

2.Cập nhật template để sử dụng directive. Ở đây, appUnless nằm trên hai thẻ <p> có giá trị condition đối lập, một true và một false.
src/app/app.component.html

<p *appUnless="condition" class="unless a"> (A) This paragraph is displayed because the condition is false.
</p> <p *appUnless="!condition" class="unless b"> (B) Although the condition is true, this paragraph is displayed because appUnless is set to false.
</p>

Dấu * ở trước appUnless để thể hiện appUnless như một structural directive
Khi condition false, đoạn trên cùng (A) xuất hiện và đoạn (B) dưới cùng biến mất.
Khi condition là true, đoạn trên cùng (A) biến mất và đoạn (B) dưới cùng xuất hiện.

Bài chia sẻ đến đấy là kết thúc, hy vọng bài viết hữu ích cho bạn!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Route in Angular JS

Router là một module được đặt tại @angular/router, cung cấp cho ứng dụng Angluar của chúng ta khả năng điều hướng và hiển thị nội dung phù hợp với địa chỉ URL. Với các ứng dụng web thông thường, việc điều hướng theo URL thường sẽ do phía server đảm nhiệm, giống như hình ảnh dưới đây là ví dụ với Rai

0 0 84

- vừa được xem lúc

Có gì mới trong Angular 11

Phiên bản Angular 11.0.0 được phát hành vào tháng 11 năm 2020. Bản phát hành chính Angular 11 cung cấp các bản cập nhật trên toàn bộ nền tảng, bao gồm CLI và các components.

0 0 89

- vừa được xem lúc

Pipe trong Angular

Xin chào tất cả mọi người, bài viết này minh xin giới thiệu về Pipe trong Angular, rất mong được mọi người theo dõi. 1) Pipe trong Angular là gì. . .

0 0 113

- vừa được xem lúc

Angular Reactive Forms: Cách sử dụng FormArray

Trong bài viết này chúng ta sẽ tìm hiểu khi nào và cách sử dụng FormArray, cả trong Component và trong Template, ngoài ra chúng ta sẽ xem cách để custom validation cho nó. Vì sao chúng ta cần sử dụng FormArray.

0 0 92

- vừa được xem lúc

RxJS và Reactive Programming

1 - Stream. Streams are a sequence of values over time.

0 0 341

- vừa được xem lúc

Mapping class Java với Angular Typescript model – Chưa bao giờ dễ đến thế

Xin chào mọi người hôm nay mình giới thiệu một loại đồ chơi cực xịn cực hay ho luôn, đây là một thư viện giúp cho mọi người tạo ra 1 class Typescript trong dự án Frontend ở đây mình lấy ví dụ là Angul

0 0 81