Кутова 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
точки зору, comp-a
є ContentChild
і comp-b
є ViewChild
. CompomentChildren
і ViewChildren
повернути ітерабельний, тоді як xChild повертає один екземпляр.
<comp-b><ng-content></ng-content></comp-b>
правильним?
Візьмемо приклад. У нас є один домашній компонент і один дочірній компонент, а всередині дочірнього компонента - один маленький дочірній компонент.
<home>
<child>
<small-child><small-child>
</child>
</home>
Тепер ви можете захопити всі дочірні елементи в контексті домашнього компонента за допомогою @viewChildren, оскільки вони безпосередньо додаються в шаблон домашнього компонента. Але, коли ви намагаєтесь отримати доступ<small-child>
елемента з контексту дочірнього компонента, ви не можете отримати доступ до нього, оскільки він безпосередньо не додається до дочірнього шаблону компонента. Він додається за допомогою проекції вмісту в дочірній компонент на домашній компонент. Тут надходить @contentChild, і ви можете схопити його за допомогою @contentChild.
Різниця виникає при спробі отримати доступ до посилань на елементи в контролері. Ви можете отримати доступ до всіх елементів, які безпосередньо додаються в шаблон компонента, від @viewChild. Але ви не можете захопити посилання на проектовані елементи за допомогою @viewChild Для доступу до проектованого елемента потрібно використовувати @contentChild.