Angular 反应式表单名称唯一验证器

Angular 反应式表单名称唯一验证器,angular,Angular,我在Angular 6中做一个web应用程序,我使用的是反应式表单。我有一个名称字段,我想验证它是否唯一。我将它的值与数组进行比较 companies: Company[]; this.companyFormGroup = this.fb.group({ name: [null, Validators.required], emailAddress: [null, Validators.compose([Validators.required, Validators.e

我在Angular 6中做一个web应用程序,我使用的是反应式表单。我有一个
名称
字段,我想验证它是否唯一。我将它的值与数组进行比较

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});
      }
    }
  }
无法读取未定义的属性“companys” 在推送时../src/app/modules/create company/create-company.component.ts.CreateCompanyComponent.uniqueValidator (创建company.component.ts:79) 在forms.js:602 在Array.map()处 at_executeValidators(forms.js:602) 位于FormGroup.validator(forms.js:567)


我的目标是,如果用户输入的名称已存在,则显示错误,如果名称唯一,则删除错误。

从FormControl/FormBuilder中调用验证程序方法时,验证程序方法中的上下文未引用当前组件。这就是
未定义的原因

您可以通过使用
bind
this
绑定到验证器以设置上下文来解决此问题:

validator: this.uniqueValidator.bind(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});
      }
    }*/
  }

如果是这样的话,那么它应该给出这样的错误。未定义uniquevalidator@wentjun??