Angular:值变化时验证器是否会清除并重新赋值错误信息?
错误不残留的底层逻辑
你的猜测不全面,实际是Angular表单默认的验证执行流程导致的:
- Angular 默认的验证更新策略为
updateOn: 'change',当任意FormControl的值发生变更时,首先会清空该控件当前的所有errors对象,再依次执行该控件自身绑定的所有同步、异步验证器,将验证返回的错误写入控件errors。 - 控件自身验证完成后,会向上冒泡触发所有父级FormGroup、FormArray的验证器执行。
- 你之前在值不匹配时通过
secondField.setErrors({ mismatch: true })手动写入的错误,会在下次secondField值变更时被Angular的前置清空逻辑清除。当值匹配时你的组验证器没有再次写入mismatch错误,自然就不会残留。
额外提醒你当前代码存在小隐患:如果仅修改第一个字段的值让两个字段匹配,此时第二个字段的值没有发生变更,Angular不会主动清空第二个字段之前的
mismatch错误,会出现值匹配但错误提示还存在的异常。建议在else分支主动清理对应错误:else { if (secondField?.hasError('mismatch')) { const remainingErrors = secondField.errors; delete remainingErrors.mismatch; secondField.setErrors(Object.keys(remainingErrors).length ? remainingErrors : null); } return null; }
验证器的通用触发时机
除了控件值变化之外,还有以下常见场景会触发验证:
- 主动调用控件/表单组的
markAsDirty()、markAsTouched()方法时(和updateOn配置有关) - 主动调用
updateValueAndValidity()方法强制重新验证时 - 提交绑定了表单的原生
<form>标签时,会触发全表单所有层级的验证 - 调用
patchValue()、setValue()、reset()等修改控件值的API时,默认会触发验证(可通过参数{ emitEvent: false }关闭) - 异步验证器的依赖项返回结果变更时,会重新触发对应异步验证
内容的提问来源于stack exchange,提问作者ArgyGeor
相关产品推荐
相关产品推荐

