Góc 2 cung cấp @ViewChild
, @ViewChildren
, @ContentChild
và @ContentChildren
trang trí để truy vấn các yếu tố hậu duệ của một thành phần.
Sự khác biệt giữa hai cái đầu tiên và hai cái sau là gì?
Góc 2 cung cấp @ViewChild
, @ViewChildren
, @ContentChild
và @ContentChildren
trang trí để truy vấn các yếu tố hậu duệ của một thành phần.
Sự khác biệt giữa hai cái đầu tiên và hai cái sau là gì?
Câu trả lời:
Tôi sẽ trả lời câu hỏi của bạn bằng thuật ngữ Shadow DOM và Light DOM (nó đến từ các thành phần web, xem thêm tại đây ). Nói chung:
@Component({
selector: 'some-component',
template: `
<h1>I am Shadow DOM!</h1>
<h2>Nice to meet you :)</h2>
<ng-content></ng-content>
`;
})
class SomeComponent { /* ... */ }
@Component({
selector: 'another-component',
directives: [SomeComponent],
template: `
<some-component>
<h1>Hi! I am Light DOM!</h1>
<h2>So happy to see you!</h2>
</some-component>
`
})
class AnotherComponent { /* ... */ }
Vì vậy, câu trả lời cho câu hỏi của bạn khá đơn giản:
Sự khác biệt giữa
@ViewChildren
và@ContentChildren
là@ViewChildren
tìm kiếm các phần tử trong Shadow DOM trong khi@ContentChildren
tìm kiếm chúng trong Light DOM.
@TemplateChildren
(thay vì @ViewChildren
) hoặc @HostChildren
(thay vì @ContentChildren
) sẽ là những cái tên hay hơn nhiều, vì trong bối cảnh như vậy, mọi thứ chúng ta đang nói đều liên quan đến chế độ xem và ràng buộc wrt cũng liên quan đến nội dung.
@ViewChildren
== con của bạn; @ContentChildren
== đứa trẻ khác của ai đó
Như tên cho thấy, @ContentChild
và @ContentChildren
các truy vấn sẽ trả về các chỉ thị hiện có bên trong <ng-content></ng-content>
phần tử của chế độ xem của bạn, trong khi đó @ViewChild
và @ViewChildren
chỉ nhìn trực tiếp vào các phần tử trên mẫu xem của bạn.
Video này từ Angular Connect có thông tin tuyệt vời về ViewChildren, ViewChild, ContentChildren và ContentChild https://youtu.be/4YmnbGoh49U
@Component({
template: `
<my-widget>
<comp-a/>
</my-widget>
`
})
class App {}
@Component({
selector: 'my-widget',
template: `<comp-b/>`
})
class MyWidget {}
Từ my-widget
quan điểm của, comp-a
là ContentChild
và comp-b
là ViewChild
. CompomentChildren
và ViewChildren
trả về một lần lặp trong khi xChild trả về một thể hiện duy nhất.
<comp-b><ng-content></ng-content></comp-b>
phải không?
Hãy lấy một ví dụ, Chúng ta có một thành phần gia đình và một thành phần con và bên trong thành phần con một thành phần con nhỏ.
<home>
<child>
<small-child><small-child>
</child>
</home>
Bây giờ bạn có thể lấy tất cả các phần tử con trong ngữ cảnh của thành phần gia đình với @viewChildren vì chúng được thêm trực tiếp vào mẫu của thành phần gia đình. Nhưng, khi bạn cố gắng truy cập <small-child>
phần tử từ ngữ cảnh của thành phần con thì bạn không thể truy cập phần tử này vì nó không được thêm trực tiếp vào mẫu thành phần con. Nó được thêm vào thông qua chiếu nội dung vào thành phần con theo thành phần nhà. Đây là nơi @contentChild đến và bạn có thể lấy nó bằng @contentChild.
Sự khác biệt xảy ra khi bạn cố gắng truy cập các yếu tố tham chiếu trong bộ điều khiển. Bạn có thể truy cập lấy tất cả các yếu tố được thêm trực tiếp vào mẫu của thành phần bởi @viewChild. Nhưng bạn không thể lấy tham chiếu các phần tử được chiếu với @viewChild Để truy cập phần tử được chiếu, bạn phải sử dụng @contentChild.