Maison  >  Questions et réponses  >  le corps du texte

Puis-je utiliser @ViewChild pour définir le focus sur une zone de texte spécifique ?

J'ai une application angulaire frontale et je souhaite mettre le focus sur une zone de texte spécifique, faire clignoter le curseur et être prêt à ce que l'utilisateur tape dans la zone de texte lors du chargement.

Après avoir cherché sur Google, j'ai pensé que @ViewChild pourrait être le bon choix. Mais jusqu'à présent, j'ai réussi à le faire fonctionner.

Voici l'intégralité de mon fichier ts autonome :

import { Component, ElementRef, ViewChild } from '@angular/core';


@Component({
  selector: 'my-app',
  template: `
    <h1>Hello from {{name}}!</h1>
    <textarea #reference placeholder="Start typing"></textarea>
  `
})
export class App {

  @ViewChild('reference') textarea: ElementRef<HTMLTextAreaElement> | undefined;
  name = 'Angular';

  ngAfterViewInit(): void {
    this.textarea?.nativeElement.focus();
  }

}

P粉477369269P粉477369269406 Il y a quelques jours489

répondre à tous(2)je répondrai

  • P粉144705065

    P粉1447050652023-09-09 13:28:26

    La première chose est de transmettre les bonnes options à @ViewChild :

    @ViewChild('myinput', {read: ElementRef})

    Sinon, vous obtiendrez des instances de composants au lieu de nœuds dom.

    Si vous n'avez pas de directive structurelle comme *ngIf/*ngFor alors vous pouvez également passer {static: true, read: ElementRef},它将使elementRef在ngOnInit中可用,否则你必须使用AfterViewInit

    répondre
    0
  • P粉436688931

    P粉4366889312023-09-09 11:08:33

    Je pense que le code ne fonctionne pas car le nativeElement n'est pas encore dans le DOM. Les travaux suivants (vous devriez voir dans la console (test1) que nativeElement est null au début de ngAfterViewInit). Il faut peut-être ajouter 1000 ms :

    ngAfterViewInit(): void {
        // nativeElement is null
        console.log('test1',this.textarea?.nativeElement);
        setTimeout(() => {
                // nativeElement is not null
                console.log('test2',this.textarea?.nativeElement);
                this.textarea?.nativeElement.focus();
    }, 1000);

    }

    Une manière plus déterministe d'attendre qu'un nativeElement apparaisse dans le DOM est décrite ici (que setTimeout) : Laissez la fonction attendre que l'élément existe

    répondre
    0
  • Annulerrépondre