Custom Validator to match Password and Confirm Password in Angular
Creating a custom validator to match the password and confirm password fields in an Angular form is a common requirement for many applications.
Introduction to Custom Validators:
Introduction to Custom Validators:
- Custom validators in Angular allow you to extend the default validation capabilities and create specific rules tailored to your needs.
- They can be used for various purposes, such as ensuring passwords match, validating email formats, or checking for forbidden values.
Signup Model
import { FormControl } from "@angular/forms";
export interface SignupFormModel{
name: FormControl<string | null>;
email: FormControl<string | null>;
password: FormControl<string | null>;
confirmPassword: FormControl<string | null>;
}
Ts File
public signupFormGroup: FormGroup<SignupFormModel> = new FormGroup<SignupFormModel>({
name: new FormControl(null, [Validators.required]),
email: new FormControl(null, [Validators.required, Validators.pattern(/[a-zA-Z0-9_\-\.]+@[a-z]+\.[c][o][m]/)]),
password: new FormControl(null, [Validators.required, Validators.pattern(/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+]).{8,}/)]),
confirmPassword: new FormControl(null, [Validators.required]),
}, { validators: this.customPasswordMatching.bind(this) });
public customPasswordMatching(control: AbstractControl): ValidationErrors | null {
const password = control.get('password')?.value;
const confirmPassword = control.get('confirmPassword')?.value;
return password === confirmPassword ? null : { passwordMismatchError: true };
}
HTML File
<div class="center-container container w-50 mt-2" style="width: 100%">
<div class="card">
<div class="card-body" style="background-color: antiquewhite">
<form [formGroup]="signupFormGroup">
<div class="mb-2" style="height: 50px; margin-top: -8px">
<div class="row">
<div class="col col-md-6">
<label class="form-control-sm">Name</label>
</div>
<div class="col">
<input type="text" class="form-control form-control-sm" formControlName="name" placeholder="Enter name"/>
<span *ngIf="(signupFormGroup.controls.name.dirty || signupFormGroup.controls.name.touched)" class="form-control-sm text-danger">
<span style="font-size: 12px; margin-top: 0px" *ngIf="signupFormGroup.controls.name.errors?.['required']">
*Name is Required
</span>
</span>
</div>
</div>
</div>
<div class="mb-2" style="height: 50px">
<div class="row">
<div class="col">
<label class="form-control-sm">Email address</label>
</div>
<div class="col">
<input type="email" class="form-control form-control-sm" formControlName="email" placeholder="name@example.com"/>
<span *ngIf="(signupFormGroup.controls.email.dirty || signupFormGroup.controls.email.touched)" class="form-control-sm text-danger">
<span *ngIf="signupFormGroup.controls.email.errors?.['required']">
*Email is Required
</span>
<span *ngIf="signupFormGroup.controls.email.errors?.['pattern']">
*Enter Valid Mail
</span>
</span>
</div>
</div>
</div>
<div class="mb-2" style="height: 50px">
<div class="row">
<div class="col col-md-6">
<label class="form-control-sm">Password</label>
</div>
<div class="col">
<input type="password" class="form-control form-control-sm" placeholder="password" formControlName="password"/>
<span *ngIf="(signupFormGroup.controls.password.dirty || signupFormGroup.controls.password.touched)" class="form-control-sm text-danger">
<span *ngIf="signupFormGroup.controls.password.errors?.['required']">
*Password is Required
</span>
</span>
</div>
</div>
</div>
<div class="mb-2" style="height: 50px">
<div class="row">
<div class="col col-md-6">
<label class="form-control-sm">Confirm Password</label>
</div>
<div class="col">
<input type="password" class="form-control form-control-sm" placeholder="Confirm Password" formControlName="confirmPassword"/>
<span *ngIf="(signupFormGroup.controls.confirmPassword.dirty || signupFormGroup.controls.confirmPassword.touched)" class="form-control-sm text-danger">
<span *ngIf="signupFormGroup.controls.confirmPassword.errors?.['required']; else passMismatch">
*Confirm Password is Required
</span>
<ng-template #passMismatch>
<span *ngIf="signupFormGroup.errors?.['passwordMismatchError']">
*Password Doesn't matches
</span>
</ng-template>
</span>
</div>
</div>
</div>
<div class="row container justify-content-center">
<button type="submit" class="btn btn-primary" (keydown.enter)="singupUser()" (click)="singupUser()">
Register Employee
</button>
<button *ngIf="isShowSbnt" class="btn btn-primary" type="button" disabled>
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
<span class="sr-only">Loading...</span>
</button>
</div>
</form>
</div>
</div>
</div>