angular响应式表单动态修改表单验证

问题背景:
在这里插入图片描述
需求如图,下方列表是一个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的验证信息。

在这里插入图片描述
红框处这两个方法可能会解决我们的问题:
在这里插入图片描述

总结:有问题看文档,总有能解决你问题的。分析问题出现的位置,

猜你喜欢

转载自blog.csdn.net/weixin_40121676/article/details/120431192
今日推荐