Angular 2 предоставляет @ViewChild, @ViewChildren, @ContentChild и @ContentChildren для запроса @ContentChildren элементов компонента.
Какая разница между первыми двумя и двумя последними?
Angular 2 предоставляет @ViewChild, @ViewChildren, @ContentChild и @ContentChildren для запроса @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.
Как следует из названия, запросы @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 comp-a есть ContentChild, а comp-b - ViewChild. CompomentChildren и ViewChildren возвращают итерацию, в то время как xChild возвращает один экземпляр.