angular async validator не запускается при отправке, если пользователь не редактирует форму

У меня есть приложение angular 10 с формой входа в систему, где я выполняю различные проверки имени пользователя и пароля.

Эти проверки выполняются с использованием асинхронного валидатора, назначенного группе форм, содержащей элементы управления формой имени пользователя и пароля, с помощью updateOn submit.

Этот асинхронный валидатор запускает вызов REST API для проверки и отправки ошибки, если таковая имеется.

Все работает нормально, за исключением того, что я заметил следующее поведение и не могу найти обходного пути.

Я ввожу имя пользователя и пароль, отправляю форму и получаю сообщение об ошибке, например, эта учетная запись еще не действительна от асинхронного валидатора.

Если я не коснусь формы и снова нажму «Отправить», ничего не произойдет, нет вызова REST API.

Если я редактирую какое-либо поле в форме входа в систему, например добавляю и удаляю символ, чтобы вернуться к исходным введенным данным, то, когда я нажимаю на «Отправить», запускается вызов REST API.

Проблема здесь в том, что данные, отправленные обратно REST API, могли измениться. Например, я мог позвонить в службу поддержки и сказать, пожалуйста, активируйте мою учетную запись прямо сейчас. Затем я собираюсь войти в систему, просто нажав кнопку входа еще раз.

Таким образом, похоже, что мой асинхронный валидатор срабатывает только в том случае, если форма обновляется пользователем, даже если мне требуется updateOn submit.

Это нормально или я что-то не так сделал? Есть ли способ запустить асинхронный валидатор при отправке, даже если форма не была обновлена?


person Eric Malalel    schedule 30.11.2020    source источник


Ответы (1)


Вот как мне это наконец удалось.

onSubmit(): void {
    if (this.loginFormGroup.untouched) {
      // force validators to run as backoffice validation data may have changed
      this.loginFormGroup.updateValueAndValidity();
    }
    this.loginFormGroup.markAsUntouched();
}
person Eric Malalel    schedule 01.12.2020