【发布时间】:2017-12-16 21:28:54
【问题描述】:
我如何验证 type="number" 的输入仅在值是数字或 null 时才有效,仅使用响应式表单(无指令)?
只有数字 [0-9] 和 .是允许的,没有“e”或任何其他字符。
到目前为止我所做的尝试:
模板:
<form [formGroup]="form" novalidate>
<input type="number" formControlName="number" id="number">
</form>
组件:
export class App {
form: FormGroup = new FormGroup({});
constructor(
private fb: FormBuilder,
) {
this.form = fb.group({
number: ['', [CustomValidator.numeric]]
})
}
}
自定义验证器:
export class CustomValidator{
// Number only validation
static numeric(control: AbstractControl) {
let val = control.value;
if (val === null || val === '') return null;
if (!val.toString().match(/^[0-9]+(\.?[0-9]+)?$/)) return { 'invalidNumber': true };
return null;
}
}
Plunker
问题是当用户输入不是数字的内容时(“123e”或“abc”) FormControl 的值变为null,请记住我不想要该字段是必需的,因此如果该字段确实为空,null 值应该是有效的。
跨浏览器支持也很重要(Chrome 的数字输入字段不允许用户输入字母 - “e”除外,但 FireFox 和 Safari 可以)。
【问题讨论】:
-
你有没有找到一个可以接受的答案?当我决定从
type="text"切换到type="number"时,我遇到了同样的问题。我不明白为什么 Angular 会更改控件的值,但对有效性没有做任何事情。对我来说似乎是一个错误。 -
对于所描述的确切情况,没有。不幸的是……
-
所以我还没有实现这个,但我计划实现一个自定义
ControlValueAccessor来克服这种行为。我已经有一个自定义日期控件,它执行类似于将符合 ISO 标准的日期字符串存储在表单值中的操作,而不是输入中显示的“10/16/2018”字符串。一旦我希望在本月的某个时候遇到关于type="number"的错误,我将在这里添加我的解决方案。 -
我也有这个问题。 AngularJS 有一个内置的数字验证器,可以使用 ng-messages="number" 访问,它没有这个问题。有些东西正在拦截非数字输入并将其清除。
标签: forms angular validation