如果 FormControl 出错,则不调用 FormGroup 异步验证程序



我已经为特定字段编写了一个异步验证器,为表单的 2 个字段编写了另一个验证器:

this.aliasCtrl = formBuilder.control('', [], [
  (control: AbstractControl) => {
    return new Promise(resolve => {
      if(control.value === 'aaa') {
        resolve({error: true});
      } else {
        resolve(null);
      }
    });
  }
]);
this.formGroup = formBuilder.group({
  firstName: formBuilder.control('', []),
  lastName: formBuilder.control('', []),
  alias: this.aliasCtrl
}, {
  asyncValidator: (group: FormGroup) => {
    return new Promise(resolve => {
      if(group.value.firstName === 'aaa' && group.value.lastName === 'aaa') {
        resolve({error2: true});
      } else {
        resolve(null);
      }
    });
  }
});

它们都正常工作。关键是,当别名控制验证器抛出错误时(当字段包含 aaa 时),"全局"验证器永远不会这样做。

我的问题:http://plnkr.co/edit/vyr48ke7fWEUwrXy43tn?p=preview

如何复制:

  1. 从第一个字段开始,在所有字段中输入aaa。很好,一切正常。
  2. 重新装填弹道。
  3. 从最后一个字段开始,在所有字段中输入aaa。编辑lastName字段firstName时不会调用"全局"验证器(我在 plunker 中添加了一些console.log来监视何时调用验证器)。

行为是故意的吗?为什么?如果错误已经存在,如何调用"全局"验证器事件?

回答我问题的一种方法是定义一个包含字段firstNamelastNameformGroup。这是一个带有解决方案的 plunker:http://plnkr.co/edit/HAmaYySbxVE15VOl9uJ4?p=preview

作为参考,我在这里发布了我的formGroup

this.aliasCtrl = formBuilder.control('', [], [(control: AbstractControl) => {
    return new Promise(resolve => {
      if(control.value === 'aaa') {
        resolve({error: true});
      } else {
        resolve(null);
      }
    });
  }
]);
this.nameGroup = formBuilder.group({
  firstName: formBuilder.control('', []),
  lastName: formBuilder.control('', [])
}, {
  asyncValidator: (group: FormGroup) => {
    return new Promise(resolve => {
      if(group.value.firstName === 'aaa' && group.value.lastName === 'aaa') {
        resolve({error2: true});
      } else {
        resolve(null);
      }
    });
  }
});
this.formGroup = formBuilder.group({
  name: this.nameGroup,
  alias: this.aliasCtrl
});

最新更新