Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro nativeElement.focus() em ngOnInt()

Por algum motivo, quando acesso tento acessar this.userNameInput.nativeElement.focus() no método ngOnInit() do sign-component o navegador explode um erro dizendo que this.userNameInput is not defined:

ERROR TypeError: "this.userNameInput is undefined"

sign-component.ts

export class SignInComponent implements OnInit {

    loginForm: FormGroup;
    @ViewChild('userNameInput', { static: false }) userNameInput: ElementRef<HTMLInputElement>;

    constructor(
        private formBuilder: FormBuilder,
        private authService: AuthService,
        private router: Router,
        private platformDetectionService: PlataformDetectorService) { }

    ngOnInit() {
        this.loginForm = this.formBuilder.group({
            userName: ['', Validators.required],
            password: ['', Validators.required]
        });
        this.platformDetectionService.isPlatformBrowser() && this.userNameInput.nativeElement.focus();
    }
}

Dei uma pesquisada e encontrei uma solução:

  • incluir o método ngAfterViewInit() e, dentro dele, acessar as propriedades conforme explicado em aula:
ngAfterViewInit(){
        this.platformDetectionService.isPlatformBrowser() && this.userNameInput.nativeElement.focus();
    }

Gostaria de saber se isso é uma característica da versão do Angular CLI que estou utilizando (8.3.5) ou se, realmente, há algo de errado no meu código.

Obrigado!

4 respostas

Fala ai Rafael, tudo bem? Acho que pode ser algum problema no seu código.

A questão é os ciclos de vida dos componentes no Angular, sendo:

  • ngOnInit: Ele é disparado durante a inicialização do componente, nele será setado as propriedades de entrada e de display.
  • ngAfterViewInit: Ele é chamado quando o Angular inicializa as views dos componentes e views filhas (child views).

Sendo assim, você precisa chamar no ngAfterViewInit pois precisa que o Angular inicialize seu ViewChild.

Espero ter ajudado.

Fala, Matheus! Blz, cara? Então, mesmo seguindo a aula, ainda tive o problema de objeto não definido quando buildo o projeto. Vou baixar a versão da aula na minha máquina pra ver se ainda tenho o erro.

Obrigado por enquanto!

solução!

Matheus, boa noite!

Encontrei o problema! Realmente tem a ver com a versão do Angular na qual estou rodando o projeto.

Na versão 8+ há uma nova propriedade a ser adicionada no decorator @ViewChild chamada static. Agora, no Agnular 8+, é necessário especificar o tempo de inicialização quando usamos o ngOnInt() para acessar determinadas propriedades do elemento.

Pelo que eu entendi, é como se o input ainda não existisse. Por isso que no ngAfterViewInit() ele funcionava normalmente.

Resumindo: para solucionar o problema, setei a propriedade static do ViewChild como true, o que foça, segundo o artigo que li, a inicialização do componente já no ngOnInit().

Abaixo segue o artigo no qual me baseei.

https://www.thecodecampus.de/blog/angular-viewchild-static-property-in-ng8/

https://blog.angular-university.io/angular-viewchild/

Grande abraço e obrigado mais uma vez!

Fala ai Rafael, tudo bem? Fico feliz que tenha resolvido o problema.

Pelo que eu entendi, é como se o input ainda não existisse. Por isso que no ngAfterViewInit() ele funcionava normalmente.

Sim, é realmente isso mesmo.

Minha sugestão é utilizar o ngAfterViewInit para isso. Acho que semânticamente faz mais sentido.

Sempre que precisar não deixe de criar suas dúvidas, vou fechar o tópico, beleza? Assim conseguimos ajudar outros alunos com problemas iguais/parecidos.

Abraços e bons estudos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software