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
input
também é umElementRef
, mas você obtém a referência ao elemento que realmente deseja, em vez de consultá-lo no hostElementRef
.ElementRef
está bem. Também usandoElementRef.nativeElement
comRenderer
está bem. O que é desencorajado é acessarElementRef.nativeElement.xxx
diretamente as propriedades .ElementRef.nativeElement)
, impede que você use a renderização no lado do servidor Angulars e o recurso WebWorker (não sei se ele também quebra o próximo compilador de modelos offline - mas acho que não).@ViewChild('myObj', { read: ElementRef }) myObj: ElementRef;
Você pode obter um identificador para o elemento DOM
ElementRef
, injetando-o no construtor do seu componente:Documentos: https://angular.io/docs/ts/latest/api/core/index/ElementRef-class.html
fonte
ElementRef
se foi.ElementRef
está disponível (de novo?).this.element.nativeElement.querySelector('#someElementId')
e passar o ElementRef para o construtor como este ..private element: ElementRef,
Import lib ...import { ElementRef } from '@angular/core';
Exemplo atualizado para funcionar com a versão mais recente
Para mais detalhes sobre o elemento nativo, aqui
fonte
Angular 4+ : use
renderer.selectRootElement
com um seletor de CSS para acessar o elemento.Eu tenho um formulário que inicialmente exibe uma entrada de email. Após a entrada do email, o formulário será expandido para permitir que continuem adicionando informações relacionadas ao seu projeto. No entanto, se eles não forem um cliente existente, o formulário incluirá uma seção de endereço acima da seção de informações do projeto.
A partir de agora, a parte de entrada de dados não foi dividida em componentes; portanto, as seções são gerenciadas com as diretivas * ngIf. Preciso focar no campo de anotações do projeto, se ele for um cliente existente, ou no campo de nome, se for novo.
Eu tentei as soluções sem sucesso. No entanto, a atualização 3 nesta resposta me deu metade da solução eventual. A outra metade veio da resposta de MatteoNY neste tópico. O resultado é este:
Como a única coisa que estou fazendo é definir o foco em um elemento, não preciso me preocupar com a detecção de alterações, para poder executar a chamada para
renderer.selectRootElement
fora do Angular. Como preciso dar tempo para as novas seções renderizarem, a seção do elemento é encapsulada em um tempo limite para permitir que os segmentos de renderização recuperem o tempo antes que a seleção do elemento seja tentada. Depois que tudo estiver configurado, posso simplesmente chamar o elemento usando seletores CSS básicos.Sei que este exemplo lidou principalmente com o evento de foco, mas é difícil para mim que isso não possa ser usado em outros contextos.
fonte
Para pessoas que tentam capturar a instância do componente dentro de um
*ngIf
ou*ngSwitchCase
, você pode seguir este truque.Crie uma
init
diretiva.Exporte seu componente com um nome como
myComponent
Use este modelo para obter a instância
ElementRef
ANDMyComponent
Use esse código no TypeScript
fonte
importar o
ViewChild
decorador de@angular/core
:Código HTML:
Código TS:
agora você pode usar o objeto 'myForm' para acessar qualquer elemento dentro da classe.
Source
fonte
fonte
inputTxt
nesse caso.Nota : Isso não se aplica ao Angular 6 e acima, como
ElementRef
aconteceuElementRef<T>
com aT
indicação do tipo denativeElement
.Gostaria de acrescentar que, se você estiver usando
ElementRef
, conforme recomendado por todas as respostas, encontrará imediatamente o problema queElementRef
possui uma declaração de tipo terrível que se parece comisso é estúpido em um ambiente de navegador em que nativeElement é um
HTMLElement
.Para solucionar isso, você pode usar a seguinte técnica
fonte
item
necessidades a ser um refElement, mesmo que você está definindo-o para outro refElement:let item:ElementRef, item2:ElementRef; item = item2; // no can do.
. Muito confuso. Mas isso é bom:let item:ElementRef, item2:ElementRef; item = item2.nativeElement
por causa da implementação que você apontou.let item: ElementRef, item2: ElementRef; item = item2
falha por causa da análise de atribuição definida. Seu segundo falha pelos mesmos motivos, mas ambos são bem-sucedidos seitem2
forem inicializados pelos motivos discutidos (ou como uma verificação rápida útil da atribuição que podemos usardeclare let
aqui). Independentemente disso, é realmente uma pena verany
uma API pública como essa.para obter o próximo irmão imediato, use este
fonte
Selecionando o elemento de destino da lista. É fácil selecionar um elemento específico da lista dos mesmos elementos.
código do componente:
Código HTML:
código css:
fonte
Exemplo mínimo para uso rápido:
#inputEl
o<input>
tag.ngAfterViewInit
gancho do ciclo de vida.Nota:
Se você deseja manipular os elementos DOM, use a API Renderer2 em vez de acessar os elementos diretamente. Permitir o acesso direto ao DOM pode tornar seu aplicativo mais vulnerável a ataques XSS
fonte