Мне не удалось успешно использовать функцию AsyncValidator в реактивной форме, и мне нужна помощь, чтобы понять причину.
функция валидатора:
export function checkVoiceNumberExists(): AsyncValidatorFn {
return (c: AbstractControl): Observable<ValidationErrors | null> => {
return (c.value === null) ? Observable.of(null) : ValidMobileNumbers.checkVoiceNumberExists(c.value)
.map(results => {
return Observable.of(results.length === 1 ? null
: { 'invalidMobileNotListed': 'This mobile number does not exist in the validation list' }
);
}
);
}
}
Мой компонент формы машинописного текста импортирует и использует функцию следующим образом:
import { checkVoiceNumberExists, checkVoiceNumberNotAllocated } from 'common/validators/company-mobile-numbers';
let fctrl_voice: FormControl = new FormControl(
'',
[SabreFormControlValidators.hasLeadingZero, SabreFormControlValidators.isTelephoneNumber],
[checkVoiceNumberExists(), checkVoiceNumberNotAllocated(empID)]
);
Я вижу, что в следующих отладочных данных должна быть возвращена ошибка:
Object {invalidMobileNotListed: "This mobile number does not exist in the validatio…"}
invalidMobileNotListed:"This mobile number does not exist in the validation list"
Однако СОСТОЯНИЕ элемента управления формы остается в ОЖИДАНИИ, как показано здесь:
<input _ngcontent-c9 = "" class = "form-control ng-dirty ng-pending ng-touched" maxlength = "11" ng-reflect-maxlength = "11" ng-reflect-name = "emp_telno_company" id = "emp_telno_company">
Я бы ожидал увидеть ng-invalid, а не ng-pending
Из-за этой проблемы
Я попытался изменить функцию валидатора с небольшими изменениями, а именно:
export function checkVoiceNumberExists(): AsyncValidatorFn {
return (c: AbstractControl): Observable<ValidationErrors | null> => {
return (c.value === null) ? Observable.of(null) : ValidMobileNumbers.checkVoiceNumberExists(c.value)
.map(results => {
return results.length === 1 ? null : { 'invalidMobileNotListed': 'This mobile number does not exist in the validation list' };
});
}
}
Что мне нужно сделать, чтобы правильно выявить ошибку валидации в этой ситуации?
Вторая реализация checkVoiceNumberExists() выглядит правильно. Но, как говорит Мартин, вам нужно проверить, возвращает ли ValidMobileNumbers.checkVoiceNumberExists наблюдаемый объект, который испускает данные.
@martin @BharatGupta Спасибо - я могу подписаться на checkInvoiceNumberExists() и отобразить ответ, как здесь: ValidMobileNumber.checkVoiceNumberExists('07392870397').subscribe( (response) => { console.info(response); }, (error) => { console.info(error); } ); Array(1) length:1 0:Object {vamob_ID: "124", vamob_number: "07392.......", vamob_type: "V", …} Так что мне кажется, что это нормально. Вы согласны с этим тестом?
Извините, опечатка checkInvoiceNumberExists() должна читать checkVoiceNumberExists()
Теперь мне кажется, что проблема связана с наличием нескольких AsyncValidator против одного FormControl. У меня это: let fctrl_voice: FormControl = new FormControl( '', [SabreFormControlValidators.hasLeadingZero, SabreFormControlValidators.isTelephoneNumber], [checkVoiceNumberExists(), checkVoiceNumberNotAllocated(empID)] ); Когда я удаляю второй asyncval, первый работает. Если убрать первый, второй заработает! ** Что все это значит? **





Вы уверены, что
ValidMobileNumbers.checkVoiceNumberExistsвозвращает завершенный наблюдаемый объект?