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

时间:2017-01-23 22:46:55

标签: validation angular asynchronous

我为特定字段编写了一个异步验证器,另一个为该字段的两个字段:

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放在从最后一个开始的所有字段中。在编辑firstName字段的lastName时,系统不会调用“全局”验证程序(我在plunker中添加了一些console.log来监视调用验证程序的时间)。
  4. 这种行为是故意的吗?为什么?如果错误已经存在,如何调用“全局”验证器事件?

1 个答案:

答案 0 :(得分:1)

回答我的问题的一种方法是定义包含字段formGroupfirstName的{​​{1}}。这是解决方案的一名成员:http://plnkr.co/edit/HAmaYySbxVE15VOl9uJ4?p=preview

供参考,我在这里lastName

formGroup