1
votes

Mise au point angulaire sur l'entrée en cliquant sur un élément

J'ai joint le stackblitz ci-dessous

https://stackblitz.com/edit/angular- dgx3pe

Ce que j'essaie de réaliser, c'est qu'en cliquant sur l'élément d'étiquette, il doit se concentrer sur l'entrée.Par conséquent, la classe input: focus est activée. Belive est que cela peut être réalisable via javascript / jquery.Mais je préfère la manière angulaire pour y parvenir.

En bref, ce sont les deux choses que j'essaye de faire,

  • Faites le focus sur l'élément d'entrée lorsque vous cliquez sur l'étiquette.
  • Lorsque le focus est changé pour un autre élément d'entrée et si l'élément précédent n'est pas vide (si une valeur est saisie) .L'étiquette doit conserver sa position en haut.

p {
  font-family: Lato;
}
.input
{
  border:none;
  border-bottom:1px solid grey;
  outline:none;
   margin-top:20%;
}
.input:focus
{
    border-bottom:1px solid orange;
}
.label
{
  position:relative;
 left:-170px;
}
.input:focus + .label
{
   bottom:20px;
}

<input class="input" type="text">
<label class="label">Name</label>

<div>
<input class="input" type="text">
<label class="label">Name</label>
</div>


3 commentaires

Voulez-vous que l'étiquette soit des constantes après le premier événement de focus sur l'élément?


Pourquoi n'essayez-vous pas Mat-Input


L'étiquette doit être de retour à la position si l'entrée n'a pas de valeur ... mais si elle a une valeur, elle doit être constante et lorsque la valeur est supprimée et que le focus est éteint, elle doit revenir à la position d'origine ... Merci pour la suggestion mais je suis essayer d'éviter le matériel ..


3 Réponses :


1
votes

Vous pouvez le faire avec du balisage pur. Vous devez ajouter un identifiant à l'entrée et un élément for à l'étiquette

  <input class="input" type="text" id="firstName" [(ngModel)]="firstName">
  <label class="label" for="firstName" [ngClass]="{'go-top': firstName}">First Name</label>

Ceci n'est qu'une partie de la spécification html - les étiquettes peuvent être associées aux entrées - la fonctionnalité prête à l'emploi ici est qu'en cliquant sur une étiquette, il met le focus sur son entrée associée. Les attributs id et for doivent correspondre pour que cela fonctionne.

Pour la deuxième partie de votre question et pour réutiliser vos classes css - ajoutez des variables correspondantes à votre composant. Utilisez ngClass pour ajouter la classe .go-top lorsque la variable a une valeur

Dans le composant -

firstName: string;

Puis dans le html -

<input class="input" type="text" id="firstName">
<label class="label" for="firstName" >First Name</label>


3 commentaires

Merci maintenant je suis capable de faire la première partie ... mais pouvez-vous m'expliquer comment cela fonctionne réellement ?? Et pouvez-vous aussi m'aider pendant que l'entrée a une certaine valeur..label devrait rester top


Merci, il l'a résolu .. Seule une chose pouvez-vous me suggérer s'il existe un moyen de le faire dynamiquement sans créer de variables séparées pour chaque entrée


[(ngModel)] est la solution parfaite pour suivre votre valeur d'entrée. Assurez-vous d'importer le module de formulaires afin de ne pas obtenir une erreur de directive inconnue: import {FormsModule} de '@ angular / forms'



1
votes
  1. Dans le html, ajoutez une référence à votre texte d'entrée - #firstNameField et ajoutez une méthode pour cliquer sur l'événement de l'étiquette - (click) = "focusOnFirstName ()"
  2.       @ViewChild("firstNameField") firstNameField;
    
          focusOnFirstName(){
            this.firstNameField.nativeElement.focus();
          }
    
    
    
    1. Dans votre composant, déclarez ViewChild et implémentez une méthode pour cliquer sur le champ d'étiquette.
        <input #firstNameField class="input" type="text">
        <label class="label" (click)="focusOnFirstName()">First Name</label>
    
    

1 commentaires

Merci, il a presque résolu ma question sauf la deuxième partie..quand s'il y a une valeur, l'étiquette doit rester en haut.Une fois retirée, elle doit être de retour à sa position d'origine



1
votes

Je regarde cela dans l'optique de créer une solution plus "angulaire" pour votre demande de style conditionnel. À cette fin, vous devez vous concentrer sur le roulement de votre combinaison entrée / étiquette dans un composant d'entrée personnalisé. Une fois que vous avez créé un composant avec vos éléments d'origine comme modèle de départ, vous pouvez appliquer plus efficacement ce qui suit:

La stratégie de base consiste à appliquer conditionnellement vos styles en utilisant la liaison de propriété [class] ou les directives [NgStyle] d'Angular.

  1. Effectuez une requête ViewChild sur le modèle de l'élément d'entrée
    1. Ajouter un écouteur d'événement sur l'élément d'entrée dans le modèle
    2. Chaque fois qu'un événement keyup est détecté, il déclenchera la vérification de la valeur de votre champ et mettra à jour une propriété de classe indiquant si le champ est vide
    3. La détection des modifications se déclenchera et les liaisons [NgClass] ou [class] déclencheront des mises à jour de la classe de l'élément
//component.html with [style] property binding
// in this instance, empty is a reference to the property in the .ts file

<label for="my-input" #label> {{ labelName }}
<input type="text" id="my-input" [class.empty]="empty" #input>
//component.html with [ngClass] directive

<label for="my-input" #label> {{ labelName }}
<input type="text" id="my-input" [ngClass]="styles()" (keyup) = "isEmpty()" #input>

//component.ts

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

@Component({
  selector: 'app-input',
  styleUrls: ['./input.component.css'],
  templateUrl: './input.component.html'
})

export class InputComponent{
  @Input() labelName: string = "Your Label Here"
  @ViewChild("input") myInput:ElementRef<any> //ViewChild query

  empty: Boolean = true; // this property will track whether input value is truthy

  isEmpty(){ // attached to keyup event on input element in your template file

   if (this.myInput.nativeElement.value){
      this.empty = false;
    } else{
      this.empty = true;
    }
  }

  styles(){ // attached to the [ngClass] directive binding on input element in template file
    return {
      'empty': this.empty ? true: false,
      'not-empty': this.empty ? false: true
    }
  } 

}


2 commentaires

Merci pour votre temps..Si vous en faites une directive, comment pouvons-nous l'attacher au formulaire..Dans mon cas, c'est un formulaire réactif..La directive d'entrée spécifique demandera un groupe de formulaires qui n'est disponible que chez le parent composant..Est-il un moyen de surmonter cela?


De plus, le code joint semble un peu déroutant, pouvez-vous partager le stackblitz.?