问题背景:
需求如图,下方列表是一个formArray组成的一个表单数组。
通过上方的修改我可以修改这个formArray中的表头,以及每一个formArray中的formGroup中的controlName。
当前问题:点击必填后,页面展示* 取消必填,对应表头不展示*,但无法保存。
问题原因:点击必填checkbox时,修改了当前controlName的Validators.required
为null,但是无效。
解决方法:
当用户的取消选择必填时:
this.form.controls.forEach((i: any) => {
i.get(item.code).setValidators(newItem.isNecessary ? Validators.required : null);
//newItem.isNecessary 是获取当前是否选择必填字段
if (i.get(item.code).errors && i.get(item.code).errors.required && !newItem.isNecessary) {
i.get(item.code).clearValidators(); //解决问题的api
i.get(item.code).updateValueAndValidity(); //解决问题的api
}
});
如果为了解决问题,看到这里相信能帮你解决你的问题
解决思路:
1。无法保存的触发原因 — formArray的valid值为false。 =》依次类推为 当前动态控制的表头由必填改为非必填导致
2。console出formArray 中对应的动态控制字段的内容。 =》 当前非必填状态,自身的valid为false =》修改自身的验证方法不对导致。(此时确定问题代码位置,为代码中的:i.get(item.code).setValidators(newItem.isNecessary ? Validators.required : null);
)
从非必填变为必填,此条问题代码可以正确执行,故,需要对取消必填时进行特殊处理。
查看angular官网 关于FormControl相关api,并个根据当前场景,无需修改正则验证,只需要删除掉当前的FormControl的验证信息。
红框处这两个方法可能会解决我们的问题:
总结:有问题看文档,总有能解决你问题的。分析问题出现的位置,