У меня недавно была эта проблема, поэтому я создал валидатор для решения этой проблемы. Как примечание, я полагаюсь на lodash, но я просто использую его для удаления неуникальных и пустых значений
Код директивы:
import { Directive, forwardRef, Input } from '@angular/core';
import { NG_VALIDATORS, Validator, FormGroup, ValidationErrors } from '@angular/forms';
import * as _ from 'lodash';
@Directive({
selector: '[pugMatchValidator]',
providers: [
{ provide: NG_VALIDATORS, useExisting: forwardRef(() => MatchValidatorDirective), multi: true }
]
})
export class MatchValidatorDirective implements Validator {
// an array of the names of form controls to check
@Input('pugMatchValidator') controlsToMatch: string[];
constructor() { }
validate(formGroup: FormGroup): ValidationErrors | null {
let values = [];
if (this.controlsToMatch) {
for (let controlName of this.controlsToMatch) {
const control = formGroup.controls[controlName];
if (control && (control.touched || control.dirty)) {
values.push(control.value);
}
}
// compact removes empty and null values
// uniq gets rid of duplicate fields, so one value should remain if everything matches
values = _.uniq(_.compact(values));
if (values.length > 1) {
return { unMatchedFields: true };
}
}
return null;
}
}
Далее просто передайте массив элементов управления, которые вы хотите проверить:
<form name="SignUpForm" #SignUpForm="ngForm" [pugMatchValidator]="['Pwd', 'RptPwd']">
Наконец, вы можете просто проверить, является ли ваша форма действительной или нет с помощью SignUpForm.valid
Edit:
В вашем случае для отображения ошибки вы должны использовать что-то вроде этого:
<div *ngIf="SignUpForm.errors?.unMatchedFields && (RptPwd.touched || RptPwd.dirty)" class="ErrCls">
Passwords do not match
</div>