Angular响应式表单多复选框FormArray的touched属性始终为false问题
问题根因
Angular响应式表单的touched状态默认仅在绑定该表单控件的DOM元素触发blur(失去焦点)事件时才会被标记为true。你当前的实现中,所有颜色复选框并未直接绑定到colors对应的FormArray实例,仅通过自定义的onCheckChange方法手动修改FormArray的取值,没有任何交互行为会触发FormArray的touched状态更新,因此它始终为false,错误提示自然无法触发。
修复方案
最小改动方案
直接在onCheckChange方法中新增一行代码,手动将colors表单控件标记为已触碰即可,修改后的代码如下:
onCheckChange(event) { const formArray: FormArray = this.form.get('colors') as FormArray; // 新增代码:用户操作复选框后手动标记控件为已触碰 this.form.get('colors')?.markAsTouched(); if (event.target.checked) { formArray.push(new FormControl(event.target.value)); } else { let i: number = 0; formArray.controls.forEach((ctrl: FormControl) => { if (ctrl.value == event.target.value) { formArray.removeAt(i); return; } i++; }); } }
修改后只要用户点击过任意颜色复选框,colors的touched就会变为true,当用户全部取消勾选时,Validators.required校验不通过,错误提示会正常展示。
规范实现方案
如果后续需要扩展表单功能,建议将每个复选框直接绑定到FormArray下的子FormControl,通过Angular原生的formControlName指令关联,可自动同步所有表单状态,无需手动维护增删和状态标记。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

