Angular 5 AsyncValidator оставляет управление со статусом: PENDING

Мне не удалось успешно использовать функцию 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

Из-за этой проблемы

  • мой класс ошибки CSS не применяется к элементу управления
  • форма СТАТУС отображается как ОЖИДАНИЕ

Я попытался изменить функцию валидатора с небольшими изменениями, а именно:

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' };
            });
    }
}

Что мне нужно сделать, чтобы правильно выявить ошибку валидации в этой ситуации?

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

martin 31.07.2018 19:30

Вторая реализация checkVoiceNumberExists() выглядит правильно. Но, как говорит Мартин, вам нужно проверить, возвращает ли ValidMobileNumbers.checkVoiceNumberExists наблюдаемый объект, который испускает данные.

Bharat Gupta 01.08.2018 07:50

@martin @BharatGupta Спасибо - я могу подписаться на checkInvoiceNumberExists() и отобразить ответ, как здесь: ValidMobileNumber.checkVoiceNumberExists('07392870397').subs‌​cribe( (response) => { console.info(response); }, (error) => { console.info(error); } ); Array(1) length:1 0:Object {vamob_ID: "124", vamob_number: "07392.......", vamob_type: "V", …} Так что мне кажется, что это нормально. Вы согласны с этим тестом?

Basil Bear 01.08.2018 11:16

Извините, опечатка checkInvoiceNumberExists() должна читать checkVoiceNumberExists()

Basil Bear 01.08.2018 11:22

Теперь мне кажется, что проблема связана с наличием нескольких AsyncValidator против одного FormControl. У меня это: let fctrl_voice: FormControl = new FormControl( '', [SabreFormControlValidators.hasLeadingZero, SabreFormControlValidators.isTelephoneNumber], [checkVoiceNumberExists(), checkVoiceNumberNotAllocated(empID)] ); Когда я удаляю второй asyncval, первый работает. Если убрать первый, второй заработает! ** Что все это значит? **

Basil Bear 01.08.2018 12:41
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
127
0

Другие вопросы по теме