【发布时间】:2020-01-21 07:05:01
【问题描述】:
我正在验证一个呼叫中心的表单,其中通常会按特定顺序填写字段。如果用户向前跳过,我想为多个字段引发错误。我发现以下方法有效:
export const recordValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
if(!firstField.value && !secondField.Value && !thirdField.value)
{
firstField.setErrors({ "firstFieldError" : true});
secondField.setErrors({ "secondFieldError" : true});
return {"firstFieldError" : true, "secondFieldError" : true};
}
}
并且 firstField 和 secondField 都正确显示错误。
现在根据docs ValidationErrors 只是错误的映射。但它显然没有任何方法,所以我想我只是将现有映射转换为 ValidationErrors 并返回:
export const recordValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {
if(!firstField.value && !secondField.Value && !thirdField.value)
{
firstField.setErrors({ "firstFieldError" : true});
secondField.setErrors({ "secondFieldError" : true});
let errorMap = new Map();
errorMap.set("firstFieldError",true);
errorMap.set("secondFieldError",true);
let errorValidators:ValidationErrors = errorMap;
return errorValidators;
}
}
但它不会引发任何错误。
我的模板如下所示:
<mat-form-field>
<input formControlName="firstField" type="datetime-local" placeholder="First Field" [errorStateMatcher]="errorMatcher" matInput>
<mat-error *ngIf="Form.errors?.firstFieldError">
First field error!
</mat-error>
</mat-form-field>
谁能帮我看看为什么第一个有效而第二个无效
【问题讨论】:
-
因为它不是地图。它是一个具有属性的对象。你的验证器也错了。不建议设置错误。它应该返回 一个对象,告诉 验证表单组或 验证表单控件是否有错误(以及哪些错误)。然后,Angular 根据验证器返回的内容设置组或控制错误和状态。
-
好的,有道理。那么在多个字段上设置错误的最佳实践是什么?每个控件都应该有自己的验证器吗?
-
如果一个控件的验证只依赖于它自己的值,那么它应该有它自己的验证器。如果它依赖于其他控件,那么它们应该在一个表单组中,并且应该在表单组上设置验证器。
标签: angular typescript angular-reactive-forms