как получить тип ошибки валидатора

У меня есть простой ввод, я хотел бы получить тип ошибки при отправке.

  formGroup: FormGroup = this.fb.group({
     password: [
       '',
       [Validators.required, Validators.minLength(8), SpecialCharacters],
     ],
   });

Например:

   onSubmit(): void {
     if (this.formGroup.invalid) {
       //I get the type of error:
         //number of characters less than 8 
         //you have not entered any special characters
     } 
   }

person Luke_C    schedule 09.06.2021    source источник
comment
Отвечает ли это на ваш вопрос? Получить все ошибки проверки из Angular 2 FormGroup   -  person Keimeno    schedule 09.06.2021
comment
Попробуйте использовать геттер, который возвращает абстрактный элемент управления для formControlName, а getter.errors должен содержать все ошибки проверки.   -  person Ramana    schedule 09.06.2021


Ответы (3)


Вы можете использовать hasError(), чтобы указать, какое сообщение вы хотите вернуть для каждой соответствующей ошибки.

пример для поля пароля:

onSubmit(): void {
  if (this.formGroup.invalid) {
    if (this.formGroup.get('password').hasError('minlength')) {
      console.log('number of characters less than 8 ');
    }
    if (this.formGroup.get('password').hasError('SpecialCharacters')) {
      console.log('you have not entered any special characters');
    }
  }
}

Другой вариант - получить доступ к ошибкам управления formGroup, например, для поля пароля:

onSubmit(): void {
  if (this.formGroup.invalid) {
    if (!!this.formGroup.controls.password.errors?.minlength) { // force it to return false if error not found
      console.log('number of characters less than 8 ');
    }
    if (!!this.formGroup.controls.password.errors?.SpecialCharacters)) {
      console.log('you have not entered any special characters');
    }
  }
}
person Wahib Kerkeni    schedule 09.06.2021
comment
не работает ни в одном из двух случаев - person Luke_C; 09.06.2021
comment
Я протестировал его на минимальной длине, и он работает, имейте в виду, что имя ошибки должно быть идентичным. Например, я написал «minLength», что неверно. Это должно быть «минимальная длина». Для вашего пользовательского валидатора «spacialCharacters» это должно быть имя ошибки, которое вы возвращаете. - person Wahib Kerkeni; 09.06.2021
comment
обновил его, чтобы исправить 'minlength'... ссылка на рабочий пример: stackblitz.com/edit/angular-qh69zg?file=src/app/ - person Wahib Kerkeni; 09.06.2021

Я бы попробовал что-то подобное для определенного formControl

get getPassword(): AbstractControl {
  return this.formGroup.get('password');
}

из .html

<div *ngIf="getPassword.errors?.minLength">Minimum Length **</div>
<div *ngIf="getPassword.errors?.maxLength">Max Length ***</div>
person Ramana    schedule 09.06.2021

На данный момент я решил это так:

 onSubmit(): void {
     if (this.formGroup.valid) {
       alert('Password salvata correttamente');
       this.formGroup.reset();
     } else {
       if (this.formGroup.controls.password.errors.minlength) {
         alert('ERROR MINLENGTH');
       }
       if (this.formGroup.controls.password.errors.specialCharacters) {
         alert(
           'ERROR SPECIALCHARACTERS'
         );
       }
     }
   }

Это нормально?

person Luke_C    schedule 09.06.2021
comment
Да, вы можете сделать это, хотя для более полных ошибок формы я советую вам сделать что-то вроде предложенного Раманой для отображения ошибок под каждым соответствующим вводом, и таким образом пользователь может сопоставить, какая ошибка относится к какому вводу. - person Wahib Kerkeni; 10.06.2021