ContentChild e ContentChildren
- ContentChild e ContentChildren
No Angular 17, @ContentChild e @ContentChildren são decoradores que permitem acessar elementos filhos de um componente que são definidos dentro do conteúdo projetado de outro componente. Isso significa que, ao invés de acessar os filhos que são diretamente declarados no template do componente, esses decoradores são usados para acessar filhos que são passados ao componente de fora, usualmente usando a técnica de projeção de conteúdo com <ng-content>. Vamos explorar cada um deles:
@ContentChild
-
Uso: O decorador
@ContentChildé usado para obter a primeira instância de um elemento filho ou diretiva do conteúdo projetado no componente. -
Como funciona: Você pode usar
@ContentChildpara acessar um componente filho, uma diretiva ou um elemento DOM baseando-se em um seletor de classe, diretiva ou referência de template local. -
Exemplo: Suponha que você queira acessar um componente
#childComponentque é passado no conteúdo de um componente pai:@Component({
selector: 'app-parent',
template: `<ng-content></ng-content>`
})
export class ParentComponent {
@ContentChild('childComponent') childComponent: ChildComponent;
ngAfterContentInit() {
// Acesso ao childComponent depois que o conteúdo é projetado
console.log(this.childComponent);
}
}
@ContentChildren
-
Uso: O decorador
@ContentChildrené usado para obter umaQueryListcontendo todas as instâncias de elementos filhos ou diretivas do conteúdo projetado. -
Como funciona: Similar ao
@ContentChild, mas em vez de retornar apenas o primeiro elemento correspondente, ele retorna todos os elementos que correspondem ao seletor especificado. -
Exemplo: Para acessar todos os componentes filhos com a diretiva
appChildDirectiveprojetados dentro de um componente:@Component({
selector: 'app-parent',
template: `<ng-content></ng-content>`
})
export class ParentComponent {
@ContentChildren(AppChildDirective) children: QueryList<AppChildDirective>;
ngAfterContentInit() {
// Acesso a todos os elementos com AppChildDirective
this.children.forEach(child => console.log(child));
}
}
<!-- app.component.html -->
<app-parent>
<div appChildDirective>Child 1</div>
<div appChildDirective>Child 2</div>
</app-parent>