Angular custom validator apply template for repetitive code

╄→гoц情女王★ 提交于 2021-01-29 11:27:18

问题


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:


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>


来源:https://stackoverflow.com/questions/57476987/angular-custom-validator-apply-template-for-repetitive-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!