Sudut 2 menyediakan @ViewChild
, @ViewChildren
, @ContentChild
dan @ContentChildren
dekorator untuk query elemen keturunan komponen ini.
Apa perbedaan antara dua yang pertama dan yang kedua?
Sudut 2 menyediakan @ViewChild
, @ViewChildren
, @ContentChild
dan @ContentChildren
dekorator untuk query elemen keturunan komponen ini.
Apa perbedaan antara dua yang pertama dan yang kedua?
Jawaban:
Saya akan menjawab pertanyaan Anda menggunakan terminologi Shadow DOM dan Light DOM (itu berasal dari komponen web, lihat lebih lanjut di sini ). Secara umum:
@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 { /* ... */ }
Jadi, jawaban untuk pertanyaan Anda cukup sederhana:
Perbedaan antara
@ViewChildren
dan@ContentChildren
adalah bahwa@ViewChildren
mencari elemen di Shadow DOM sambil@ContentChildren
mencari mereka di Light DOM.
@TemplateChildren
(bukan @ViewChildren
) atau @HostChildren
(bukannya @ContentChildren
) akan menjadi nama yang jauh lebih baik, karena dalam konteks seperti itu semua yang kita bicarakan terkait dengan tampilan, dan pengikatan juga terkait konten.
@ViewChildren
== anak Anda sendiri; @ContentChildren
== Seseorang anak lain
Seperti namanya, @ContentChild
dan @ContentChildren
kueri akan mengembalikan arahan yang ada di dalam <ng-content></ng-content>
elemen tampilan Anda, sedangkan @ViewChild
dan @ViewChildren
hanya melihat elemen yang ada di template tampilan Anda secara langsung.
Video dari Angular Connect ini memiliki info bagus tentang ViewChildren, ViewChild, ContentChildren, dan ContentChild https://youtu.be/4YmnbGoh49U
@Component({
template: `
<my-widget>
<comp-a/>
</my-widget>
`
})
class App {}
@Component({
selector: 'my-widget',
template: `<comp-b/>`
})
class MyWidget {}
Dari my-widget
perspektif, comp-a
adalah ContentChild
dan comp-b
adalah ViewChild
. CompomentChildren
dan ViewChildren
kembalikan iterable sementara xChild mengembalikan satu instance.
<comp-b><ng-content></ng-content></comp-b>
benar?
Mari kita ambil contoh, Kami memiliki satu komponen rumah dan satu komponen anak dan di dalam komponen anak satu komponen anak kecil.
<home>
<child>
<small-child><small-child>
</child>
</home>
Sekarang Anda dapat mengambil semua elemen anak dalam konteks komponen rumah dengan @viewChildren karena ini ditambahkan langsung ke templat komponen rumah. Tetapi, ketika Anda mencoba mengakses <small-child>
elemen dari konteks komponen anak maka Anda tidak dapat mengaksesnya karena tidak secara langsung ditambahkan dalam templat komponen anak. Itu ditambahkan melalui proyeksi konten menjadi komponen anak oleh komponen rumah. Di sinilah @contentChild masuk dan Anda dapat mengambilnya dengan @contentChild.
Perbedaan terjadi ketika Anda mencoba mengakses referensi elemen di controller. Anda dapat mengakses ambil semua elemen yang langsung ditambahkan ke template komponen oleh @viewChild. Tetapi Anda tidak dapat mengambil referensi elemen yang diproyeksikan dengan @viewChild Untuk mengakses elemen yang diproyeksikan, Anda harus menggunakan @contentChild.