Почему этот пользовательский валидатор не работает?

#angular

#angular

Вопрос:

Создан новый файл numbers-not-allowed. Мое имя вводит в заблуждение, но это просто для тестирования перед фактической реализацией.

Если входное значение не равно hi, то должна возникнуть ошибка. Что я делаю не так.

 import { AbstractControl } from '@angular/forms';

export function NumbersNotAllowed(control: AbstractControl) {
    if (control.value !== 'hi') {
      return { containsNumber: true };
    }
    return null;
  }
  

В файле ts

      import { NumbersNotAllowed } from '../validators/numbers-not-allowed'; 
        ngOnInit() {
            this.contactForm = this.formBuilder.group({
              fullName: ['', [Validators.required, Validators.maxLength(70)], NumbersNotAllowed],
        }
        //for convience easy access to form fields
         get c() { return this.contactForm.controls }

    onSubmit() {
        console.log(this.contactForm.value);
        this.submitted = true;
        if (this.contactForm.invalid) {
          return;
        }
      }
}
  

HTML-шаблон. Остальная часть проверки работает, за исключением пользовательской.

  <form [formGroup]="contactForm" (ngSubmit)="onSubmit()" class="apply-form">
       <div *ngIf="c.fullName.hasError('containsNumber')" data-tip="Error from custom validator"></div>
       <div *ngIf="c.fullName.touched">
       <div *ngIf="c.fullName.hasError('maxlength')" data-tip="Full name cannot be larger than 70 characters"></div>
       </div>
      <input formControlName='fullName' (focus)="nameInput()"
      [ngClass]="{'face error-border': (c.fullName.errors?.required amp;amp; c.fullName.touched) 
      || c.fullName.errors?.required amp;amp; submitted amp;amp; c.fullName.pristine}"
      placeholder="Your Full Name" type="text" tabindex="1">
 </form>
  

Ответ №1:

У меня есть несколько простых пользовательских проверок с использованием регулярных выражений, это помогает, когда количество проверок увеличивается для входных данных. Я применил его к вашему коду, поделившись ссылкой.Проверьте, помогает ли это https://stackblitz.com/edit/angular-9omtlr?file=src/app/app.component.ts

Ответ №2:

Переместите свой пользовательский валидатор в sync массив validators. Пример:

Синтаксис управления формой

 controlName: ['initalvalue', [sync validators], [async validtors]];
  

текущий код:

 fullName: ['', [Validators.required, Validators.maxLength(70)], NumbersNotAllowed],
  

исправить:

 fullName: ['', [Validators.required, Validators.maxLength(70), NumbersNotAllowed],
  

Ответ №3:

Yiu добавил валидатор «NumbersNotAllowed» в качестве асинхронного валидатора, добавьте его внутрь массива во втором аргументе FormControl «FullName»

 ngOnInit() {
    this.contactForm = this.formBuilder.group({
        fullName: ['', [Validators.required, Validators.maxLength(70), NumbersNotAllowed]]
    })
}