前言:
我问以下问题的部分原因是,当我在<input>
字段上没有type=number
的情况下执行form.value.purchaseCost
时,我会得到一个字符串。为了手动检查字段,我不得不手动转换为Number
。最初,我假设Angular会将值存储为表单上的数字,因为它有一个Validators.min
约束
问题
这是字段定义:
<mat-form-field>
<input matInput type="number" formControlName="purchaseCost" placeholder="Purchase cost*">
<mat-error>Please enter a purchase cost</mat-error>
</mat-form-field>
这是验证器检查:
purchaseCost: new FormControl('', [Validators.required, Validators.min(0)]),
由于表单字段为type="number"
,FormControl
在检查字段中的条目是否大于0(min(0))之前是否执行转换?
此外,如果我们得到form.value.purchaseCost
,我们是否需要在使用它之前将purchaseCost
转换为数字,或者自字段type=number
以来,Angular Reactive Forms实现是否为我们这样做?
换句话说,Angular Reactive Forms是否将值存储为<input>
字段中包含的类型?
是的,它将在内部执行类型转换,同时根据您在表单控件上设置的规则进行验证。
因此,您可以选择删除输入中的type
属性。如果您要删除它,我建议您在表单控件上包含另一个Validator,以便它检查输入是否为数字。
<mat-form-field>
<input matInput [formControl]="purchaseCost" placeholder="Purchase cost*">
<mat-error *ngIf="purchaseCost.errors && purchaseCost.errors.required">Please enter a purchase cost</mat-error>
<mat-error *ngIf="purchaseCost.errors && purchaseCost.errors.min">Min. value is 0</mat-error>
<mat-error *ngIf="purchaseCost.errors && purchaseCost.errors.pattern">Please enter a number</mat-error>
</mat-form-field>
在您的component.ts上,我在purchaseCost
表单控件上添加了一个regex模式验证器。
purchaseCost = new FormControl('', [
Validators.required,
Validators.pattern("^[0-9]*$"),
Validators.min(0)
]);
我在这里添加了一个演示。