如何验证具有嵌套表单组的反应式表单? [英] How to validate reactive forms with nested form groups?
本文介绍了如何验证具有嵌套表单组的反应式表单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是https://angular.io/docs/ts/latest/cookbook/form-validation.html#!#reactive
中的示例分叉该示例以角度显示,当表单没有任何嵌套组时使用validationMessages
。当我有嵌套的表单组时,我不确定如何扩展它。以下是我要创建的示例表单和验证消息。
buildForm(): void {
this.heroForm = this.fb.group({
'name': [this.hero.name, [
Validators.required,
Validators.minLength(4),
Validators.maxLength(24),
forbiddenNameValidator(/bob/i)
]
],
'address': this.fb.group({
'city': [''],
'state': ['']
}),
'alterEgo': [this.hero.alterEgo],
'power': [this.hero.power, Validators.required]
});
this.heroForm.valueChanges
.subscribe(data => this.onValueChanged(data));
this.onValueChanged(); // (re)set validation messages now
}
预期formErrors
和validationMessages
formErrors = {
'name': '',
'power': '',
'address': {
'state': '',
'city': ''
}
};
validationMessages = {
'name': {
'required': 'Name is required.',
'minlength': 'Name must be at least 4 characters long.',
'maxlength': 'Name cannot be more than 24 characters long.',
'forbiddenName': 'Someone named "Bob" cannot be a hero.'
},
'power': {
'required': 'Power is required.'
},
'address': {
'city': {
'required': 'City is required.',
'minlength': 'City must be at least 4 characters long.',
},
'state': {
'required': 'State is required.',
'minlength': 'State must be at least 4 characters long.',
}
}
};
以下是onValueChanged
onValueChanged(data?: any) {
if (!this.heroForm) { return; }
const form = this.heroForm;
for (const field in this.formErrors) {
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.dirty && !control.valid) {
const messages = this.validationMessages[field];
for (const key in control.errors) {
this.formErrors[field] += messages[key] + ' ';
}
}
}
}
如何更新上述onValueChanged
函数以支持嵌套表单组验证?
推荐答案
我知道这是一个古老的故事,但我试图同步获取validateAllFormGroups(formGroup: FormGroup)
,但我在某个地方找不到任何答案,因此我实现了我的方法:
function validateAllFormGroups(formGroup: FormGroup): boolean {
let hasErrors = false;
Object.keys(formGroup.controls).forEach((field) => {
const control = formGroup.get(field);
hasErrors =
control instanceof FormGroup
? hasErrors || !validateAllFormGroups(control)
: hasErrors || !!control?.errors;
});
return !hasErrors;
}
您可以调整它以获得应用程序逻辑所需的结果,对我来说,布尔值就足够了。
欢迎任何优化或建议
这篇关于如何验证具有嵌套表单组的反应式表单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文