Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular Forms: How to avoid multiple NgIf divs for validation error messages?

I would like to simplify the code below:

<div *ngIf="form1.errors?.checkDate && (form1.touched || form1.dirty)" class="cross-validation-error-message alert alert-danger">
    Date can't be in the future.
</div>
<div *ngIf="form1.errors?.notAfterDate && (form1.touched || form1.dirty)" class="cross-validation-error-message alert alert-danger">
    Birth Date must be after 1/1/1800.
</div>

It should have only 1 div *ngif and pass the error message as a value instead of hardcoding or use a ngFor?

Any help on this is much appreciated. Thanks.

like image 246
Harry Avatar asked Mar 13 '26 06:03

Harry


1 Answers

A common technique to manage multiple Angular Form validation messages is to store them in a map.

public validationMessages = {
  'firstName': [
    { type: 'required', message: 'First Name is required' },
    { type: 'maxlength', message: 'First Name may only contain 5 characters.' }
  ],
  'lastName': [
    { type: 'required', message: 'Last Name is required' },
    { type: 'pattern', message: 'Last Name may not be "Smith".' }
  ],
  'email': [
    { type: 'required', message: 'Email is required' },
    { type: 'email', message: 'Enter a valid email' }
  ]
}

HTML Template

In the template, use NgFor to iterate through the validation messages for the desired form control.

<label>
  Email:
  <input type="email" autocomplete="email" formControlName="email" required>
</label>
<!-- Validation Errors -->
<div *ngFor="let validation of validationMessages.email">
  <div *ngIf="profileForm.get('email').hasError(validation.type) && (profileForm.get('email').dirty || profileForm.get('email').touched)">
    <small style="color:red;">{{validation.message}}</small>
  </div>
</div>

Example

See Stackblitz Demo

like image 133
Christopher Peisert Avatar answered Mar 14 '26 19:03

Christopher Peisert