Уникальный валидатор имени реактивной формы

#angular

#angular

Вопрос:

Я создаю веб-приложение на Angular 6 и использую реактивную форму. У меня есть name поле, которое я хочу проверить, уникально оно или нет. Я сравниваю его значение с массивом.

 companies: Company[];

this.companyFormGroup = this.fb.group({
      name: [null, Validators.required],
      emailAddress: [null, Validators.compose([Validators.required, Validators.email])]
    }, {validator: this.uniqueValidator});

uniqueValidator(control: AbstractControl) {
    const name = control.get('name').value;

    if (control.get('name').valid) {
      const isNameUnique = this.companies.map(company => company.name).some(value => value === name);

      if (!isNameUnique) {
        console.log(isNameUnique);
        control.get('name').setErrors({unavailable: true});
      }
    }
  }
  

Не удается прочитать свойство ‘companies’ из undefined
в push../src/app/modules/create-company/create-company.component.ts.CreateCompanyComponent.uniqueValidator
(create-company.component.ts:79)
в forms.js:602
в Array.map ()
в _executeValidators (forms.js:602)
в FormGroup.validator (forms.js:567)

Моя цель — выдать ошибку, если имя, введенное пользователем, уже существует, и удалить ошибку, если имя уникально.

Ответ №1:

контекст в вашем методе валидатора при вызове из FormControl / FormBuilder не ссылается на ваш текущий компонент. Это причина, по которой this будет не определено.

Вы исправляете это, используя bind для привязки this к валидатору, чтобы задать контекст:

 validator: this.uniqueValidator.bind(this)
  

Вы можете протестировать его, распечатав this до и после применения bind:

 uniqueValidator(control: AbstractControl) {
    const name = control.get('name').value;
    console.log(this)
     /*
    if (control.get('name').valid) {
      const isNameUnique = this.companies.map(company => company.name).some(value => value === name);

      if (!isNameUnique) {
        console.log(isNameUnique);
        control.get('name').setErrors({unavailable: true});
      }
    }*/
  }
  

Комментарии:

1. Если это так, то он должен был выдать ошибку, подобную этой.uniquevalidator не определен @wentjun??