Я пытался добавить проверку формы через директиву, которую я прикрепил к полю.Директива получает вызов по keyup и blur.В настоящее время, когда критерий ошибки удовлетворен, устанавливается ошибка, но я столкнулся с проблемой, при которой при вводе другого ключа сообщение об ошибке будет мигать (исчезать и появляться снова).
Просмотр элементов в консоли.Я вижу, что при нажатии клавиши Key (нажатие / удержание) моя директива еще не вызывается, но кое-как, как класс ngvalid добавляется к входу и сообщение об ошибке очищается.Отказ от ключа запускает мою директиву и сбрасывает ошибку.Я пробовал другую логику на ошибку переключения в HTML, но конечный результат тот же.Если бы я удалил слушатель keyup и строго запустил размытие, я получил бы похожий результат: введите неверное значение -> щелчок при вводе вызывает ошибку -> перефокусировка и нажатие клавиши приводит к исчезновению ошибки.
КомпонентHTML
<div [formGroup]="group">
<label for="item?.keyName" class="input-label">{{item?.titleText}}</label>
<input
id="item?.keyName"
name="name"
type="text"
data-id="textInput"
[placeholder]="item?.placeHolder"
zipCodeValidator
[formControlName]="item?.keyName"
required>
<span [hidden]="!group.get(item?.keyName).dirty && !group.get(item?.keyName).errors?.zipCode">
{{group.get(item?.keyName).errors?.zipCode}}
</span>
</div>
Директива
import {Directive, HostListener} from '@angular/core';
import {AbstractControl, NgControl} from '@angular/forms';
@Directive({
selector: '[zipCodeValidator]',
})
export class ZipCodeValidator {
private regex: RegExp = new RegExp(/^(?:\d{5})?$/);
private errorMessages = {
badRegex: 'Enter a valid 5-digit US zip code. E.g. 48226.',
emptyValue: 'Please enter a value.',
};
constructor(private control: NgControl) {}
@HostListener('keyup')
public onKeyUp(): void {
this.validateZipCode();
}
@HostListener('blur')
public onBlur(): void {
this.validateZipCode();
}
private validateZipCode(): void {
const formControl: AbstractControl = this.control.control;
let errorMessage: string = null;
if (!formControl.value) {
errorMessage = this.errorMessages.emptyValue;
}
if (!this.regex.test(formControl.value)) {
errorMessage = this.errorMessages.badRegex;
}
formControl.setErrors({ zipCode: errorMessage });
}
}
Ожидаемый результат состоит в том, что при установке ошибки сообщение об ошибке должно оставаться и не очищаться никаким другим событием, кроме директивы.