Я написал собственный валидатор, чтобы получить 2 значения даты из группы форм и сравнить их. Кажется, что когда этот валидатор запускает последнее значение, необходимое для логики, оно не обновляется вовремя, прежде чем логика попытается запустить.
У меня console.log, и весь валидатор попытался найти проблему, похоже, проблема в проверке достоверности последнего необходимого значения.
Пользовательский валидатор:
// Validate Effective Date Vs. Termination Date
valEffDateTermDate(c: AbstractControl): { [key: string]: boolean } | null {
let effDate = c.get('effectiveDate').value;
let termDate = c.get('terminationDate').value;
let dateRegex = /(?:0[1-9]|[1-2][0-9]|3[0-1])\/(?:0[1-9]|1[0-2])\/(?:19\d\d|20\d\d|99\d\d)/g;
let isValidEffDate = dateRegex.test(effDate);
let isValidTermDate = dateRegex.test(termDate);
if (effDate.length === 10 && termDate.length === 10 && isValidEffDate === true && isValidTermDate === true) {
console.log('Initial Criteria Met');
if (new Date(effDate).toISOString() >= new Date(termDate).toISOString()) {
console.log('Setting effDateTermDate to true');
return { effDateTermDate: true};
}
return null;
}
return null;
}
Настройка FormBuilder:
// Angular FormBuilder Construction and Initialization
this.createCodeForm = this.fb.group({
codeName: ['', [ Validators.required,
Validators.pattern('^[a-zA-Z0-9]*$'),
this.v.valCodeName(this.selectedDisplayedName) ]],
codeSetName: this.selectedCSName,
codeSubSetName: this.selectedCSSubName,
createCodeDates: this.fb.group({
effectiveDate: ['', [ Validators.required,
this.v.valDate,
this.v.valEffDateCSEffDate(this.selectedEffDate)
]],
terminationDate: ['', [ Validators.required,
this.v.valDate,
this.v.valTermDateCSTermDate(this.selectedTermDate)]],
systemEffectiveDate: ['', [ Validators.required,
this.v.valDate,
this.v.valSysEffDateCSSysEffDate(this.selectedSysEffDate)]],
systemTerminationDate: ['', [ Validators.required,
this.v.valDate,
this.v.valSysTermDateCSSysTermDate(this.selectedSysTermDate)]],
}, { validator: Validators.compose([this.v.valEffDateTermDate,
this.v.valEffDateSysTermDate,
this.v.valTermDateSysTermDate,
this.v.valSysEffDateSysTermDate])}
),
typeCode: '',
classification: '',
subClassification: '',
copayCode: ['' , [ this.v.valCopayCode(this.selectedDisplayedName) ]],
shortDescription: ['', [Validators.required, Validators.maxLength(100)]],
longDescription: ['', [Validators.required, Validators.maxLength(500)]],
comments: ['', [Validators.maxLength(300)]]
});
}
Ожидаемые результаты для valEffDateTermDate после того, какffectiveDate и termDate имеют длину === 10 и действительны для регулярного выражения. Никаких ошибок не возникает, логика не запускается после ввода 10-го символа для termDate, когда действительная дата уже введена.
Обратите внимание, что если я уберу проверку isValidTermDate === true, логика запустится, после добавления обратно в логику даже не запустится.