实现思路
- 创建一个自定义验证器函数,该函数接收一个
AbstractControl
参数,这个参数实际上是包含密码和确认密码输入框的表单组。
- 在验证器函数中,从
AbstractControl
中获取密码和确认密码输入框的值。
- 比较这两个值是否相等,如果不相等则返回一个包含错误信息的对象,否则返回
null
,表示验证通过。
核心代码
- 创建自定义验证器函数
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
export function passwordMatchValidator(): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
const password = control.get('password');
const confirmPassword = control.get('confirmPassword');
if (password && confirmPassword && password.value!== confirmPassword.value) {
return { passwordMismatch: true };
}
return null;
};
}
- 在表单中使用自定义验证器
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
@Component({
selector: 'app-password-match',
templateUrl: './password-match.component.html',
styleUrls: ['./password-match.component.css']
})
export class PasswordMatchComponent {
passwordForm: FormGroup;
constructor(private fb: FormBuilder) {
this.passwordForm = this.fb.group({
password: ['', Validators.required],
confirmPassword: ['', Validators.required]
}, { validators: passwordMatchValidator() });
}
}
- 在模板中显示错误信息
<form [formGroup]="passwordForm">
<div>
<label for="password">Password:</label>
<input type="password" id="password" formControlName="password">
</div>
<div>
<label for="confirmPassword">Confirm Password:</label>
<input type="password" id="confirmPassword" formControlName="confirmPassword">
<div *ngIf="passwordForm.hasError('passwordMismatch') && (passwordForm.get('confirmPassword').touched || passwordForm.get('confirmPassword').dirty)">
Passwords do not match.
</div>
</div>
</form>