Đó là một trong những ngày tôi đang bận làm việc với các tính năng mới cho dự án văn phòng của mình. Đột nhiên, một cái gì đó thu hút sự chú ý của tôi
Trong khi kiểm tra DOM, tôi thấy ngcontent
được áp dụng trên các phần tử bởi Angular. Hmm… nếu chúng chứa các thành phần trong DOM cuối cùng thì việc sử dụng là gì?
Trong hành trình tìm kiếm câu trả lời cho những câu hỏi của mình, tôi đã phát hiện ra khái niệm về . Trước sự ngạc nhiên của tôi, cũng có
*ngTemplateOutlet
. Tôi bắt đầu hành trình tìm kiếm sự rõ ràng về hai khái niệm nhưng giờ tôi đã có bốn khái niệm trong số đó, nghe gần giống nhau
Bạn đã từng rơi vào hoàn cảnh này chưa? . Vì vậy, không có gì khó chịu, hãy xem từng cái một
1.
Như tên gợi ý, là một phần tử mẫu mà Angular sử dụng với các chỉ thị cấu trúc [
*ngIf
, *ngFor
, [ngSwitch]
và các chỉ thị tùy chỉnh]
Các phần tử mẫu này chỉ hoạt động khi có các chỉ thị cấu trúc. Góc bọc phần tử máy chủ [mà chỉ thị được áp dụng] bên trong và tiêu thụ
trong DOM đã hoàn thành bằng cách thay thế nó bằng nhận xét chẩn đoán
Hãy xem xét một ví dụ đơn giản về *ngIf
Hình trên là giải thích Góc của *ngIf
. Góc đặt phần tử máy chủ mà chỉ thị được áp dụng trong và giữ nguyên máy chủ. DOM cuối cùng tương tự như những gì chúng ta đã thấy ở đầu bài viết này
Cách sử dụng
Chúng ta đã thấy cách Angular sử dụng nhưng nếu chúng ta muốn sử dụng nó thì sao?
Ở đây 6 là thuộc tính
7 của thành phần được đặt thành giá trị
8. Đầu ra của đoạn mã trên trong DOM
Không có gì được kết xuất. . [
Nhưng tại sao chúng ta không thể thấy thông báo của mình ngay cả sau khi sử dụng đúng với chỉ thị cấu trúc?
Đây là kết quả mong đợi. Như chúng ta đã thảo luận, Angular thay thế bằng các nhận xét chẩn đoán. Không còn nghi ngờ gì nữa, đoạn mã trên sẽ không tạo ra bất kỳ lỗi nào, vì Angular hoàn toàn ổn với trường hợp sử dụng của bạn. Bạn sẽ không bao giờ biết chính xác những gì đã xảy ra đằng sau hậu trường
Hãy so sánh hai DOM trên được kết xuất bởi Angular
Nếu bạn để ý kỹ, sẽ có thêm một thẻ nhận xét trong DOM cuối cùng của Ví dụ 2. Mã mà Angular giải thích là
Angular bao bọc máy chủ của bạn trong một
khác và chuyển đổi không chỉ
bên ngoài thành nhận xét chẩn đoán mà còn cả bên trong. Đây là lý do tại sao bạn không thể xem bất kỳ tin nhắn nào của mình
Để thoát khỏi điều này, có hai cách để có được kết quả mong muốn của bạn
Phương pháp 1
Trong phương pháp này, bạn đang cung cấp cho Angular định dạng không có đường mà không cần xử lý thêm. Lần này, Angular sẽ chỉ chuyển đổi thành nhận xét nhưng để nguyên nội dung bên trong nó [chúng không còn bên trong bất kỳ
nào như trong trường hợp trước]. Do đó, nó sẽ hiển thị nội dung chính xác
Để biết thêm về cách sử dụng định dạng này với các chỉ thị cấu trúc khác, hãy tham khảo bài viết này
Phương pháp 2
Đây là một định dạng khá ít thấy và ít được sử dụng [dùng hai anh em ]. Ở đây chúng tôi đang cung cấp một tham chiếu mẫu cho
*ngIf
trong 8 của nó để cho biết mẫu nào nên được sử dụng nếu điều kiện là đúng
Không nên sử dụng nhiều như thế này [bạn có thể sử dụng
thay thế] vì đây không phải là ý nghĩa của chúng. Chúng được sử dụng làm nơi chứa các mẫu có thể được sử dụng lại ở nhiều nơi. Chúng tôi sẽ đề cập nhiều hơn về điều này trong phần sau của bài viết này
2.
Bạn đã bao giờ viết hoặc nhìn thấy mã giống như thế này chưa
Lý do tại sao nhiều người trong chúng ta viết mã này là không có khả năng sử dụng nhiều chỉ thị cấu trúc trên một phần tử máy chủ duy nhất trong Angular. Bây giờ mã này hoạt động tốt nhưng nó giới thiệu thêm một số 1 trống trong DOM nếu
2 là một giá trị giả có thể không bắt buộc
Người ta có thể không quan tâm đến một ví dụ đơn giản như thế này nhưng đối với một ứng dụng lớn có DOM phức tạp [để hiển thị hàng chục nghìn dữ liệu], điều này có thể trở nên rắc rối vì các phần tử có thể có các trình nghe được đính kèm với chúng vẫn sẽ ở đó trong DOM lắng nghe các sự kiện
Điều thậm chí còn tồi tệ hơn là mức độ lồng ghép mà bạn phải thực hiện để áp dụng kiểu dáng [CSS] của mình
Đừng lo lắng, chúng tôi có để giải cứu
Angular là một phần tử nhóm không can thiệp vào kiểu hoặc bố cục vì Angular không đặt nó trong DOM
Vì vậy, nếu chúng ta viết Ví dụ 1 với
Chúng tôi nhận được DOM cuối cùng là
Hãy xem chúng tôi đã thoát khỏi những 1 trống rỗng đó. Chúng ta nên sử dụng
khi chúng ta chỉ muốn áp dụng nhiều chỉ thị cấu trúc mà không đưa vào bất kỳ phần tử bổ sung nào trong DOM của chúng ta
Để biết thêm thông tin tham khảo tài liệu. Có một trường hợp sử dụng khác trong đó nó được sử dụng để đưa một mẫu động vào một trang. Tôi sẽ đề cập đến trường hợp sử dụng này trong phần cuối của bài viết này
3.
Chúng được sử dụng để tạo các thành phần cấu hình. Điều này có nghĩa là các thành phần có thể được cấu hình tùy thuộc vào nhu cầu của người dùng. Điều này còn được gọi là Chiếu nội dung. Các thành phần được sử dụng trong các thư viện đã xuất bản sử dụng để tự cấu hình
Hãy xem xét một thành phần 9 đơn giản
Nội dung HTML được truyền trong thẻ mở và thẻ đóng của thành phần 9 là nội dung được chiếu. Đây là cái mà chúng tôi gọi là Trình chiếu nội dung. Nội dung sẽ được hiển thị bên trong
trong thành phần. Điều này cho phép người tiêu dùng của thành phần
9 chuyển bất kỳ chân trang tùy chỉnh nào trong thành phần và kiểm soát chính xác cách họ muốn nó được hiển thị
nhiều phép chiếu
Điều gì sẽ xảy ra nếu bạn có thể quyết định nội dung nào sẽ được đặt ở đâu? . Cần một bộ chọn phần tử để quyết định nội dung nào sẽ chiếu bên trong một cụ thể
Đây là cách
Chúng tôi đã sửa đổi định nghĩa 9 để thực hiện phép chiếu Đa nội dung. Thuộc tính
4 chọn loại nội dung sẽ được hiển thị bên trong một
cụ thể. Ở đây chúng tôi có
4 đầu tiên để hiển thị phần tử tiêu đề
*ngTemplateOutlet
1. Nếu nội dung được chiếu không có phần tử *ngTemplateOutlet
1 thì nội dung đó sẽ không hiển thị bất kỳ nội dung nào. Tương tự, 4 thứ hai tìm kiếm một
*ngTemplateOutlet
4. Phần còn lại của nội dung được hiển thị bên trong cuối cùng mà không có
4
Gọi thành phần sẽ giống như
4. *ofTemplateOutlet
...Chúng được sử dụng làm nơi chứa các mẫu có thể được sử dụng lại ở nhiều nơi. Chúng tôi sẽ đề cập nhiều hơn về điều này trong phần sau của bài viết này.
…Có một trường hợp sử dụng khác trong đó nó được sử dụng để đưa một mẫu động vào một trang. Tôi sẽ đề cập đến trường hợp sử dụng này trong phần cuối của bài viết này.
Đây là phần mà chúng ta sẽ thảo luận về hai điểm đã đề cập ở trên. *ngTemplateOutlet
được sử dụng cho hai trường hợp — để chèn một mẫu chung vào các phần khác nhau của chế độ xem bất kể vòng lặp hoặc điều kiện và để tạo một thành phần có cấu hình cao
tái sử dụng mẫu
Xem xét một chế độ xem mà bạn phải chèn một mẫu ở nhiều nơi. Ví dụ, một logo công ty được đặt trong một trang web. Chúng tôi có thể đạt được điều đó bằng cách viết mẫu cho logo một lần và sử dụng lại nó ở mọi nơi trong chế độ xem
Sau đây là đoạn mã
Như bạn có thể thấy, chúng tôi chỉ viết mẫu logo một lần và sử dụng nó ba lần trên cùng một trang với một dòng mã
*ngTemplateOutlet
cũng chấp nhận một đối tượng bối cảnh có thể được chuyển để tùy chỉnh đầu ra mẫu chung. Để biết thêm thông tin về đối tượng ngữ cảnh, hãy tham khảo tài liệu chính thức
thành phần tùy chỉnh
Trường hợp sử dụng thứ hai cho *ngTemplateOutlet
là các thành phần được tùy chỉnh cao. Xem xét ví dụ trước của chúng tôi về thành phần 9 với một số sửa đổi
Trên đây là phiên bản sửa đổi của thành phần 9 chấp nhận ba thuộc tính đầu vào —
2,
3,
4. Sau đây là đoạn trích cho
5
Những gì chúng tôi đang cố gắng đạt được ở đây là hiển thị tiêu đề, nội dung và chân trang khi nhận được từ thành phần chính của 9. Nếu bất kỳ mẫu nào trong số chúng không được cung cấp, thành phần của chúng tôi sẽ hiển thị mẫu mặc định ở vị trí của nó. Do đó, việc tạo ra một thành phần tùy biến cao
Để sử dụng thành phần được sửa đổi gần đây của chúng tôi
Đây là cách chúng tôi sẽ chuyển các tham chiếu mẫu cho thành phần của chúng tôi. Nếu bất kỳ một trong số chúng không được thông qua thì thành phần sẽ hiển thị mẫu mặc định
nội dung so với. *ofTemplateOutlet
Cả hai đều giúp chúng tôi đạt được các thành phần tùy biến cao nhưng nên chọn cái nào và khi nào?
Có thể thấy rõ ràng rằng *ngTemplateOutlet
cho chúng ta thêm sức mạnh hiển thị mẫu mặc định nếu không có mẫu nào được cung cấp
Đây không phải là trường hợp của 8. Nó hiển thị nội dung như là. Ở mức tối đa, bạn có thể chia nhỏ nội dung và hiển thị chúng ở các vị trí khác nhau trong chế độ xem của mình với sự trợ giúp của thuộc tính
4. Bạn không thể hiển thị nội dung trong vòng
8 một cách có điều kiện. Bạn phải hiển thị nội dung nhận được từ phụ huynh mà không có cách nào để đưa ra quyết định dựa trên nội dung
Tuy nhiên, việc lựa chọn giữa hai hoàn toàn phụ thuộc vào trường hợp sử dụng của bạn. Ít nhất bây giờ chúng tôi có một vũ khí mới *ngTemplateOutlet
trong kho vũ khí của mình, cung cấp nhiều quyền kiểm soát hơn đối với nội dung bên cạnh các tính năng của 8
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Đọc thêm bài viết
Nếu bài viết này hữu ích, hãy tweet nó
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu