ViewChild
- это декоратор, который позволяет получить ссылку на элемент или компонент, определенный в шаблоне текущего компонента.
Получает доступ к:
Доступен после инициализации представления (в хуке ngAfterViewInit
)
import { ViewChild, Component, ElementRef } from '@angular/core';
@Component({
template: `
<app-child #childComp></app-child>
<div #contentDiv>Some content</div>
`
})
export class ParentComponent {
@ViewChild('childComp') childComponent: ChildComponent;
@ViewChild('contentDiv', { read: ElementRef }) divElement: ElementRef;
ngAfterViewInit() {
console.log(this.childComponent); // Доступ к дочернему компоненту
console.log(this.divElement.nativeElement); // Доступ к DOM-элементу
}
}
{ static: true }
- доступен в ngOnInit
(для статических элементов){ read: Type }
- указывает тип возвращаемого элементаContentChild
- декоратор для доступа к элементам, спроецированным в компонент через ng-content.
ngAfterContentInit
)@Component({
selector: 'app-container',
template: `
<ng-content></ng-content>
<ng-content select="[special]"></ng-content>
`
})
export class ContainerComponent {
@ContentChild('projectedItem') projectedItem: ElementRef;
@ContentChild(SpecialDirective) specialDirective: SpecialDirective;
ngAfterContentInit() {
console.log(this.projectedItem);
console.log(this.specialDirective);
}
}
Использование компонента:
<app-container>
<div #projectedItem>Regular content</div>
<div special>Special content</div>
</app-container>
Характеристика | ViewChild | ContentChild |
---|---|---|
Источник | Шаблон текущего компонента | Спроецированный контент (ng-content) |
Доступность | После ngAfterViewInit | После ngAfterContentInit |
Использование | Для внутренних элементов компонента | Для контента, передаваемого в компонент |
Статический режим | Доступен в ngOnInit при static: true | Аналогично ViewChild |
ngAfterViewInit
/ngAfterContentInit
{ static: true }
+ ngOnInit
if (this.childComponent) {
this.childComponent.doSomething();
}
ViewChild:
ngAfterViewInit
или { static: true }
ContentChild:
<ng-content>
ngAfterContentInit
Общие рекомендации:
Правильное использование ViewChild и ContentChild важно для создания гибких и поддерживаемых компонентов в Angular.