3
votes

Comment afficher l'erreur de tapis une fois que la zone de texte est sale et mise au point?

Je veux afficher l'erreur mat juste après que l'utilisateur a commencé à écrire quelque chose sur un élément d'entrée. Voici mon code:

<mat-error *ngIf="password.dirty">
    <mat-error *ngIf="password.errors?.pattern">
        Password must be 8 characters long, one numeric, one special character....
    </mat-error>
</mat-error>

Je veux afficher le message d'erreur une fois que l'utilisateur a commencé à taper l'entrée. Actuellement, l'erreur apparaît sur la zone de texte perdue le focus. J'ai également essayé de la manière suivante:

<mat-form-field appearance="outline">
    <mat-label>Password</mat-label>
    <input matInput type="password" placeholder="Password" required [(ngModel)]='model.password' #password='ngModel' name='Password' [minlength]='requiredLength' [pattern]="passwordPattern">
    <mat-error *ngIf="password.errors?.pattern">
        Password must be 8 characters long, one numeric, one special character....
    </mat-error>
</mat-form-field>

Mais cela produit également le même comportement qu'avant. Une solution possible consisterait probablement à utiliser mat-hint. Mais je ne veux pas le montrer comme un indice selon l'exigence, je dois le montrer comme une erreur.

Au fait, j'utilise ng-form.

Est-ce possible d'obtenir le comportement spécifié en utilisant mat-error sur ng-form? ou je dois personnaliser le css pour mat-hint pour qu'il ressemble au message d'erreur?


2 commentaires

Pouvez-vous poster le code du composant?


@ FabianKüng J'ai utilisé ng-form et dans mon fichier de composant, je viens d'initialiser le modèle et d'autres variables.


3 Réponses :


1
votes

Si vous souhaitez déclencher la validation à chaque frappe effectuée par l'utilisateur, vous devez utiliser une petite solution de contournement. Je vous suggère d'utiliser un FormControl , qui vous permettra ensuite de définir un validateur directement sur ce contrôle et aussi d'écouter les changements émis par valueChanges pour marquer le FormControl comme touché pour déclencher la validation (peut-être y a-t-il une meilleure solution à cela?).

Voir le stackblitz . La validation se fait via le Validators.pattern (minimum de 8 caractères, au moins une lettre, un chiffre et un caractère spécial), il n'y a donc plus besoin d'un validateur de longueur obligatoire ou minimum.


1 commentaires

Merci pour la suggestion. l'a voté car c'est définitivement un moyen de contourner. Mais en fait, il s'agit d'une petite partie d'un formulaire plus grand où je devais montrer le comportement attendu avec un changement minimal sur toute la page. Le formulaire est déjà développé sur ng-form, le convertir en FormControl entraînerait un changement dans chaque entrée de la page. Je cherchais une solution sans utiliser FormControl, s'il y en a!



6
votes

vous pouvez le faire de cette manière -

onChange($event, password){
    this.model.password = $event;
    if(!password.control.touched){
      password.control.markAsTouched();
    }
}

et dans votre méthode component.ts add onChange () -

<mat-form-field appearance="outline">
  <mat-label>Password</mat-label>
  <input matInput 
        type="password"
        placeholder="Password"
        name='Password'
        [ngModel]='model.password'
        (ngModelChange)="onChange($event, password)"
        #password='ngModel'
        [minlength]='requiredLength'
        [pattern]="passwordPattern"
        required>
  <mat-error *ngIf="password.errors?.pattern"">
      Password must be 8 characters long, one numeric, one special character....
  </mat-error>
</mat-form-field>


1 commentaires

oui, cela sert le but. Mais je ne comprends pas pourquoi je devrais envoyer le paramètre d'événement et le lier à partir du fichier component.ts? car il est déjà lié à l'aide de ngModel. y a-t-il une raison de faire cela?