【发布时间】:2022-01-02 07:15:09
【问题描述】:
所以我有一个表单,其中只有当另一个控件有值时才需要一个控件,为此我创建了以下结构
profileGroup = this.fb.group({
username: [''],
address: [
'',
[
(control: AbstractControl) => {
if (this.profileGroup?.get('username')?.value) {
return (Validators.required)(control);
}
return (Validators.nullValidator)(control);
},
],
],
});
此函数运行良好,一旦username 控件获得值,Validators.required 就会添加到address 控件中。但是,尽管添加了验证器,但 address 控件的有效性不会更新,因此该控件仍标记为 valid。
如果可能的话,我想避免使用类似的东西
this.profileGroup.get('username')?.valueChanges.subscribe(val=>{
this.profileGroup.get('address')?.updateValueAndValidity()
})
因为可能存在我不知道名称的动态控件,并且不想为每个控件设置可观察对象。
这是一个工作示例的堆栈闪电战 https://stackblitz.com/edit/angular-10-formbuilder-example-m8qjq8?file=src/app/app.component.ts
【问题讨论】:
-
updateValueAndValidity()是一个 AbstractControl 类方法,我想你可以为this.profileGroup运行这个方法,它应该可以工作,让我知道你是怎么做的 -
当您开始在地址字段中插入一个值时会发生什么,如果您删除您输入的内容,控件是否显示为有效?由于您仅在插入用户名时设置地址验证器,所以是什么阻止用户首先插入他的地址,然后再插入他的用户名?你将如何处理?不确定您是否愿意以及它是否符合您的需求,但我建议您在 init 和提交处理无效状态(错误消息或 css 更改等)的两个字段中添加所需的验证器 - 毕竟预期有效表单将填写用户名和地址字段。
-
@DeepakJha 您的意思是将其插入验证器的功能中?不,它不起作用
-
@MishaMashina 是的,如果我键入内容然后清除它,该控件会正确标记为无效。尽管用户名为空,但地址控件是否有值无关紧要,但如果用户名有某些内容,则必须要求地址
-
读取您的 cmets,您是否从某些不受您控制的服务(例如某些 API)获取表单字段元素的名称?
标签: angular angular-reactive-forms formbuilder angular-validation angular-validator