Em vez de injetar ElementRef
e usar querySelector
ou similar a partir daí, uma maneira declarativa pode ser usada para acessar elementos na visualização diretamente:
<input #myname>
@ViewChild('myname') input;
elemento
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Exemplo de StackBlitz
- @ViewChild () suporta diretiva ou tipo de componente como parâmetro ou o nome (string) de uma variável de modelo.
- O @ViewChildren () também suporta uma lista de nomes como lista separada por vírgula (atualmente não são permitidos espaços
@ViewChildren('var1,var2,var3')
).
- @ContentChild () e @ContentChildren () fazem o mesmo, mas na luz DOM (
<ng-content>
elementos projetados).
descendentes
@ContentChildren()
é o único que permite também consultar descendentes
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
deve ser o padrão, mas não está na versão 2.0.0 final e é considerado um bug
Isso foi corrigido na versão 2.0.1
ler
Se houver um componente e diretrizes, o read
parâmetro permite especificar qual instância deve ser retornada.
Por exemplo, ViewContainerRef
exigido pelos componentes criados dinamicamente, em vez do padrãoElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
assinar alterações
Mesmo que os filhos de exibição sejam definidos apenas quando ngAfterViewInit()
chamados e os filhos de conteúdo somente quando ngAfterContentInit()
chamados, se você deseja assinar alterações do resultado da consulta, isso deve ser feito emngOnInit()
https://github.com/angular/angular/issues/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
acesso direto ao DOM
pode consultar apenas elementos DOM, mas não componentes ou instâncias de diretiva:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
obtenha conteúdo projetado arbitrário
Consulte Acessar conteúdo transcluído