Angular 响应式表单中的 FormGroup 实例设置错误未按预期工作

Setting errors on a FormGroup instance in Angular Reactive Forms not working as expected

我正在使用 Angular 4.4.3 响应式表单为表单中的一组控件实施自定义验证。根据文档,方法 AbstractControl.setErrors 更新了 AbstractControl 的错误 属性,在其上调用它,更新其 parent 的状态,但不更新 parents 错误 属性。我想在 FormGroup 实例上设置错误 属性,所以我使用 FormGroup 继承的 setErrors。但是,它不会按预期更新错误。

以下是我的示例代码: 在 FormControl 实例上尝试它,确实会更新它们的错误以及它们的 parents 的有效性状态(但不是 parents 错误!):

let myFormGroup 
    = this._formBuilder
          .group({
                   ctrl1: [null],
                   ctrl2: [null]
                 }, 
                 {
                   validator: (fg: FormGroup) => {
                                   let ctrl1 = fg.get('ctrl1'),
                                       ctrl2 = fg.get('ctrl2'),
                                       ctrl1Empty = !ctrl1.value,
                                       ctrl2Empty = !ctrl2.value;

                                       //Successfully sets ctrl1.errors and fg.status, but not fg.errors 
                                       if (ctrl1empty)
                                         ctrl1.setErrors({ctrl1required: true});
                                       //Successfully sets ctrl2.errors and fg.status, but not fg.errors 
                                       if (ctrl2Empty)
                                         ctrl2.setErrors({ctrl2required: true});
                                       //Doesn't work, doesn't update fg.errors
                                       if (ctrl1Empty && ctrl2Empty)
                                         fg.setErrors({required: true});
                              }
                 })

知道为什么吗?

所以,多亏了@incognito的确认,经过进一步检查,我才知道问题出在哪里。

setErrors,确实设置了表单组实例的错误属性。但是,我的问题中显示的自定义验证器没有明确 return 一个值(即一个错误的未定义值)。查看 angular 中反应式表单模块的代码,我发现 this method, which merges errors raised by various validators in this line,该方法检查错误(在我的代码片段中未定义)是否不等于 null。此条件(如在其 es5 版本中检查的那样)评估为 false,这导致结果为 null,从而忽略代码中设置的错误 属性 的内容。我吸取的教训是:总是 return 来自自定义验证器的值,即使进一步嵌套的 FormGroup 实例有自己的自定义逻辑来设置错误。