TypeScript中setValue方法配合mat-select表单使用不生效问题排查
问题原因
你遇到的是Angular响应式表单的控件状态校验问题:
- 通过
setValue给表单控件赋值时,默认只会更新控件的value属性,不会修改控件的pristine/dirty、untouched/touched状态,也不会主动触发值校验更新valid状态。 - 你的+号绑定的新增函数中,if判断条件除了校验字段值之外,一定额外加了对控件状态的校验(比如要求控件为
dirty、valid状态),所以哪怕值已经是0,状态不满足也会返回false。 - 截图里紫色的字段就是
pristine(未经过用户手动交互)状态的样式,手动输入后控件变为dirty状态,样式变为白色,同时满足状态校验条件,新增功能就正常生效。
解决方法
两种方案选其一即可:
方案1:赋值时同步更新控件状态
修改selectionChange事件中的赋值逻辑,给字段赋值后同步更新状态、触发校验,示例代码如下:
// 获取对应表单控件 const tatControl = this.form.get('tat'); const enterDistanceControl = this.form.get('enterDistance'); // 赋值 tatControl.setValue(0); enterDistanceControl.setValue(0); // 标记为已交互状态 tatControl.markAsDirty(); tatControl.markAsTouched(); enterDistanceControl.markAsDirty(); enterDistanceControl.markAsTouched(); // 主动触发校验更新valid状态 tatControl.updateValueAndValidity(); enterDistanceControl.updateValueAndValidity();
方案2:简化新增逻辑的校验规则
如果你的业务场景允许只要值合法就可以新增,不需要限制必须是用户手动输入的内容,直接修改+号绑定函数的if判断,去掉其中关于控件dirty、touched状态的校验,只保留值和valid状态的校验即可。
内容的提问来源于stack exchange,提问作者krish
相关产品推荐
相关产品推荐

