Bah*_*haa 4 validation typescript angular angular-reactive-forms angular-forms
我正在使用 Angular 4.4.3 反应式表单来为表单中的一组控件实现自定义验证。根据文档,方法AbstractControl.setErrors更新调用该方法的 AbstractControl 的错误属性,更新其父级的状态,但不更新父级的错误属性。我想在 FormGroup 实例上设置错误属性,因此我使用 FormGroup 继承的 setErrors。但是,它不会按预期更新错误。
以下是我的示例代码:在 FormControl 实例上尝试,确实更新了它们的错误及其父级的有效性状态(但不是父级错误!):
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});
}
})
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
所以,感谢@incognito的确认,我在进一步检查后找出了问题所在。
setErrors,设置表单组实例的错误属性。但是,我的问题中显示的自定义验证器没有显式返回值(即错误的未定义值)。查看 Angular 中反应式表单模块的代码,我发现了这个方法,它合并了这一行中各种验证器引发的错误,该方法检查错误(在我的代码片段中未定义)是否不等于 null。此条件(如其 es5 版本中所检查的那样)计算结果为 false,这会导致结果为 null,从而忽略代码中设置的错误属性的内容。我学到的教训是:始终从自定义验证器返回一个值,即使进一步嵌套的 FormGroup 实例有自己的用于设置错误的自定义逻辑。
归档时间: |
|
查看次数: |
6588 次 |
最近记录: |