เชิงมุม 2 มี@ViewChild
, @ViewChildren
, @ContentChild
และ@ContentChildren
ตกแต่งสำหรับการสอบถามองค์ประกอบลูกหลานองค์ประกอบของ
ความแตกต่างระหว่างสองคนแรกและสองหลังคืออะไร?
เชิงมุม 2 มี@ViewChild
, @ViewChildren
, @ContentChild
และ@ContentChildren
ตกแต่งสำหรับการสอบถามองค์ประกอบลูกหลานองค์ประกอบของ
ความแตกต่างระหว่างสองคนแรกและสองหลังคืออะไร?
คำตอบ:
ฉันจะตอบคำถามของคุณโดยใช้คำศัพท์Shadow DOMและLight DOM (มาจากส่วนประกอบของเว็บดูเพิ่มเติมที่นี่ ) โดยทั่วไป:
@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 { /* ... */ }
ดังนั้นคำตอบสำหรับคำถามของคุณนั้นง่ายมาก:
ความแตกต่างระหว่าง
@ViewChildren
และ@ContentChildren
คือ@ViewChildren
มองหาองค์ประกอบใน Shadow DOM ขณะที่ค้นหาองค์ประกอบ@ContentChildren
เหล่านี้ใน Light DOM
@TemplateChildren
(แทน@ViewChildren
) หรือ @HostChildren
(แทน@ContentChildren
) จะเป็นชื่อที่ดีกว่ามากอย่างเช่นในบริบทที่ทุกสิ่งที่เรากำลังพูดถึงนั้นเกี่ยวข้องกับมุมมองและการเชื่อมโยง WRT ก็เกี่ยวข้องกับเนื้อหาด้วย
@ViewChildren
== ลูกของคุณเอง; @ContentChildren
== ลูกของคนอื่น
ตามชื่อที่แนะนำ@ContentChild
และ@ContentChildren
เคียวรีจะส่งคืนคำสั่งที่มีอยู่ภายใน<ng-content></ng-content>
องค์ประกอบของมุมมองของคุณในขณะที่@ViewChild
และ@ViewChildren
ดูเฉพาะองค์ประกอบที่อยู่บนเทมเพลตมุมมองของคุณโดยตรง
วิดีโอจาก Angular Connect มีข้อมูลที่ยอดเยี่ยมเกี่ยวกับ ViewChildren, ViewChild, ContentChildren และ ContentChild https://youtu.be/4YmnbGoh49U
@Component({
template: `
<my-widget>
<comp-a/>
</my-widget>
`
})
class App {}
@Component({
selector: 'my-widget',
template: `<comp-b/>`
})
class MyWidget {}
จากmy-widget
มุมมองของ 's, comp-a
เป็นContentChild
และเป็นcomp-b
และคืนค่า iterable ในขณะที่ xChild คืนค่าอินสแตนซ์เดียวViewChild
CompomentChildren
ViewChildren
<comp-b><ng-content></ng-content></comp-b>
ต้องหรือไม่
ให้ยกตัวอย่างเรามีองค์ประกอบภายในบ้านหนึ่งองค์ประกอบและองค์ประกอบย่อยหนึ่งองค์ประกอบและองค์ประกอบย่อยภายในองค์ประกอบย่อยหนึ่งองค์ประกอบย่อย
<home>
<child>
<small-child><small-child>
</child>
</home>
ตอนนี้คุณสามารถคว้าองค์ประกอบลูกทั้งหมดในบริบทขององค์ประกอบภายในบ้านด้วย @viewChildren ได้เนื่องจากสิ่งเหล่านี้จะถูกเพิ่มเข้าไปในแม่แบบขององค์ประกอบภายในบ้านโดยตรง แต่เมื่อคุณพยายามเข้าถึง<small-child>
องค์ประกอบจากบริบทขององค์ประกอบลูกคุณจะไม่สามารถเข้าถึงองค์ประกอบได้เนื่องจากไม่ได้เพิ่มโดยตรงในแม่แบบองค์ประกอบลูก มันถูกเพิ่มผ่านการฉายเนื้อหาลงในองค์ประกอบลูกโดยองค์ประกอบบ้าน นี่คือที่มาของ @contentChild และคุณสามารถคว้ามันได้ด้วย @contentChild
ความแตกต่างเกิดขึ้นเมื่อคุณพยายามเข้าถึงการอ้างอิงองค์ประกอบในคอนโทรลเลอร์ คุณสามารถเข้าถึงคว้าองค์ประกอบทั้งหมดที่เพิ่มลงในเทมเพลตของส่วนประกอบโดยตรงโดย @viewChild แต่คุณไม่สามารถคว้าการอ้างอิงองค์ประกอบที่ฉายด้วย @viewChild ในการเข้าถึงองค์ประกอบที่ฉายไว้คุณจะต้องใช้ @contentChild