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
Content Projection trong Angular

Content Projection trong Angular

  • 21-12-2023
  • Toanngo92
  • 0 Comments

Mục lục

  • Làm thế nào để sử dụng ng-content?
  • Sử dụng multiple ng-content được không?
  • ng-content và selector trong angular
  • ng-content và ngProjectAs trong angular

Làm thế nào để sử dụng ng-content?

Bây giờ, hãy nghĩ về cách tận dụng sức mạnh của ng-content trong Angular. Giả sử chúng ta có một component Toggle – một công cụ mà chúng ta muốn tái sử dụng để thu thập ý kiến từ người dùng. Cụ thể, chúng ta muốn đặt các câu hỏi dạng Yes/No và muốn mỗi câu hỏi có một nhãn riêng.

Vậy làm thế nào để làm điều này mà không phải thêm các tham số vào component? Đây là nơi mà ng-content tỏ ra hữu ích. Thay vì chỉ định rõ câu hỏi trong component, chúng ta có thể chèn nội dung trực tiếp từ bên ngoài vào component mà không cần sửa đổi component đó.

Trong component Toggle, chúng ta có một cấu trúc HTML như sau:

<div class="toggle-wrapper" [class.checked]="checked" tabindex="0" (click)="toggle()">
  <div class="toggle"></div>
</div>
<div class="toggle-label">
  <ng-content></ng-content>
</div>

Ở đây, ng-content chính là chỗ mà nội dung từ bên ngoài sẽ được chèn vào.

Ở phía component cha, chúng ta có thể sử dụng component Toggle như sau để tạo các câu hỏi khác nhau:

<app-toggle [(checked)]="questions.question1">
  <span>Would you recommend our service? Yes/No</span>
</app-toggle>
<app-toggle [(checked)]="questions.question2">
  <span>Did our product meet your expectations? Yes/No</span>
</app-toggle>

Nhìn vào đây, mỗi lần chúng ta sử dụng app-toggle, chúng ta chèn một câu hỏi cụ thể thông qua thẻ span. Điều này giúp chúng ta tạo ra các câu hỏi khác nhau một cách dễ dàng mà không cần phải chỉnh sửa trực tiếp vào component Toggle.

Sử dụng multiple ng-content được không?

Nếu bạn muốn sử dụng nhiều ng-content trong một template, có phải khi bạn đặt chúng nhiều lần thì tất cả sẽ hiển thị ra hay không? Hãy xem xét ví dụ sau:

Trong một component, chúng ta thử sử dụng ng-content hai lần:

<div class="toggle-label">
  <div>content 1</div>
  <ng-content></ng-content>
</div>
<div class="toggle-label">
  <div>content 2</div>
  <ng-content></ng-content>
</div>

Nếu chúng ta nhìn vào kết quả render, chỉ thấy content 2 được hiển thị với nhãn mà chúng ta truyền vào. Điều này có nghĩa là việc sử dụng nhiều ng-content có thể không cho kết quả như chúng ta mong đợi. Tại sao lại như vậy?

Điều này hoàn toàn bình thường, giống như các thẻ HTML khác như header, chúng ta chỉ có một vùng để hiển thị. Vì vậy, với ng-content dạng này, chỉ nên có một tag duy nhất được sử dụng.

Khi bạn đặt nhiều ng-content, Angular sẽ hiểu rằng nội dung của tất cả chúng sẽ được thay thế bởi nội dung truyền vào cuối cùng. Điều này có thể dẫn đến việc mất đi nội dung của ng-content trước đó và chỉ hiển thị nội dung của ng-content cuối cùng. Điều này rõ ràng cho thấy tại sao chỉ có content 2 được hiển thị trong trường hợp này.

ng-content và selector trong angular

ng-content và selector trong Angular mang đến khả năng kiểm soát rất linh hoạt, giống như khi bạn sắp xếp các phần tử trong thẻ table HTML. Bất kể bạn đặt thead, tbody hay tfoot ở đâu, chúng sẽ hiển thị theo thứ tự đúng đắn: thead trước, sau đó tbody, và cuối cùng là tfoot. Angular cũng cho phép chúng ta điều chỉnh thứ tự hiển thị của nội dung thông qua việc kết hợp ng-content với các selector.

Nhưng khi nói về việc dùng nhiều ng-content, có điều cần lưu ý. Không phải là khi chúng ta sử dụng ng-content để chọn tất cả các phần tử.

Selector có thể có nhiều dạng khác nhau:

  • Selector theo thẻ: <ng-content select="some-component-selector-or-html-tag"></ng-content>
  • Selector theo CSS Class: <ng-content select=".some-class"></ng-content>
  • Selector theo thuộc tính: <ng-content select="[some-attr]"></ng-content>
  • Kết hợp nhiều selector: <ng-content select="some-component-selector-or-html-tag[some-attr]"></ng-content>

Ví dụ với component Toggle:

<header>
  <ng-content select=".toogle-header"></ng-content>
</header>
<div class="toggle-wrapper" [class.checked]="checked" tabindex="0" (click)="toggle()">
  <div class="toggle"></div>
</div>
<div class="toggle-label">
  <ng-content select="label"></ng-content>
</div>
<div class="toggle-content">
  <ng-content></ng-content>
</div>

Trong file app.component.html, ngay cả khi chúng ta đặt các phần tử không theo thứ tự, Toggle component vẫn hiển thị như chúng ta mong muốn.

<app-toggle [(checked)]="questions.question1">
  <h3 class="toggle-header">Header 1</h3>
  <label>Question 1</label>
  <span>Some paragraph</span>
</app-toggle>

<app-toggle [(checked)]="questions.question2">
  <h3 class="toggle-header">Header 2</h3>
  <span>Some paragraph 2</span>
  <label>Question 2</label>
</app-toggle>

Tuy nhiên, khi sử dụng selector, nếu có nhiều phần tử thỏa mãn điều kiện của selector, ng-content sẽ nhận tất cả các phần tử đó. Điều này cần được lưu ý để tránh hiển thị không mong muốn.

ng-content và ngProjectAs trong angular

Ng-content và ngProjectAs trong Angular có thể đem lại sự linh hoạt cho việc truyền nội dung vào các component, nhưng đôi khi, khi chúng ta muốn sử dụng một selector cụ thể nhưng không thể làm được điều đó, có cách nào để giải quyết vấn đề này không?

Giả sử bạn muốn component Toggle nhận vào một component có selector là app-label, nhưng người khác có thể muốn sử dụng một loại label khác hoặc thậm chí là một thẻ label thông thường từ HTML, và có thể component app-label không nằm trực tiếp bên trong app-toggle mà nó được bao bọc bởi một thẻ div chẳng hạn.

Ở đây, selector của chúng ta không thể nhận dạng đúng phần tử cần truyền vào. Có một cách để báo cho Angular biết rằng chúng ta muốn chuyển nội dung này vào component như thế nào, đó là ngProjectAs. Đây là cách để chỉ định một cách rõ ràng về cách thức xử lý nội dung được chuyển vào.

Trong file app.component.html:

<app-toggle [(checked)]="questions.question1">
  <h3 class="toogle-header">Header 1</h3>
  <label ngProjectAs="app-label">Question 1</label>
  <span>Some paragraph</span>
</app-toggle>

Bằng cách sử dụng ngProjectAs="app-label" trong label, chúng ta báo cho Angular biết rằng phần nội dung này nên được xử lý như là một app-label, ngay cả khi nó không phải là một component app-label trực tiếp và có thể bị bao bọc bởi các phần tử khác.

Rất nhiều thư viện như ngx-dropzone cũng sử dụng kỹ thuật này để cho phép người dùng tùy chỉnh và sử dụng các thành phần một cách linh hoạt hơn.

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

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

Một số cải tiến trong ASP.NET Core, Razor Page, Model Binding, Gabbage collection

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
×