0

I have multiple input fields where almost same validation is required. Is there any way to reduce repetitive HTML code for displaying error.

My code is as below


              <div colspan="2">
                <input type="text" name="appName" [disabled]="recordCreated" [(ngModel)]="appName" appForbiddenName="Application" minlength="4"
                  required #name="ngModel" [ngClass]="{'has-danger': name.invalid && (name.dirty || name.touched) }" />
                <div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger">
                  <div *ngIf="name.errors.required">
                    Name is required.
                  </div>
                  <div *ngIf="name.errors.minlength">
                    Name must be at least 4 characters long.
                  </div>
                  <div *ngIf="name.errors.forbiddenName">
                    Name cannot be Application.
                  </div>
                </div>
              </div>

            <div colspan="2">
                <input type="text" name="appName" [disabled]="recordCreated" [(ngModel)]="desc" appForbiddenName="Application" minlength="4"
                  required #desc="ngModel" [ngClass]="{'has-danger': desc.invalid && (desc.dirty || desc.touched) }" />
                <div *ngIf="desc.invalid && (desc.dirty || desc.touched)" class="alert alert-danger">
                  <div *ngIf="desc.errors.required">
                    Desc is required.
                  </div>
                  <div *ngIf="desc.errors.minlength">
                    Desc must be at least 4 characters long.
                  </div>
                  <div *ngIf="desc.errors.forbiddenName">
                    Desc cannot be Application.
                  </div>
                </div>
              </div>

import { Directive, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, ValidatorFn } from '@angular/forms';
import { AbstractControl } from '@angular/forms/src/model';

export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
  return (control: AbstractControl) : {[key: string] : any} | null => {
    const forbidden = nameRe.test(control.value);
    return forbidden ? {'forbiddenName': {value: control.value}} : null;
  };
}

@Directive({
  selector: '[appForbiddenName]',
  providers: [{ provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true }]
})
export class ForbiddenValidatorDirective implements Validator {

  @Input('appForbiddenName') forbiddenName: string;

  validate(control: AbstractControl): { [key: string]: any } | null {
    return this.forbiddenName ? forbiddenNameValidator(new RegExp
      (this.forbiddenName, 'i'))(control) : null;
  }


}


Except input field and mandatory div tag all other validator html code is repeating for each input field. Is there a way may be in directive where I can return error message tamplates. instead of just null

1 Answer 1

1

You can create a component with input properties something like

export class YourCustomComponent{
@Input() control:FormControl;
@Input() errMessages:any;//it should be an object like {required:'desc is req'}
constructor(){
}

}

in html

        <div *ngIf="control.invalid && (control.dirty || control.touched)" class="alert alert-danger">
                  <div *ngIf="control.errors.required">
                   errMessages.required
                  </div>
                  ......so on
         </div>

Then use it under your input like

 <your-custom-component [control]="desc" [errMessages]="{required:'desc is required'}"> </your-custom-component>
Sign up to request clarification or add additional context in comments.

1 Comment

Oh I was wondering how to add such code in directive. Its really nice. Thank you :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.