type="number"
の入力が、Reactive Forms(ディレクティブなし)のみを使用して値が数値または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;
}
}
問題は、ユーザーが数字以外の何か( "123e"または "abc")を入力すると、FormControlの値がnull
になることです。フィールドが必須ではないため、フィールドが本当に空の場合はnull
値が有効である必要があります。
クロスブラウザのサポートも重要です(Chromeの数字入力フィールドでは、ユーザーは文字を入力できません-「e」を除くが、FireFoxとSafariは可能です)。
HTMLファイルでは、このようにあなたのためのパターンngIfを追加することができます
<div class="form-control-feedback" *ngIf="Mobile.errors && (Mobile.dirty || Mobile.touched)">
<p *ngIf="Mobile.errors.pattern" class="text-danger">Number Only</p>
</div>
.TSではあなたがバリデータのパターンを追加することができますファイル - 「^ [0-9] * $」
this.Mobile = new FormControl('', [
Validators.required,
Validators.pattern("^[0-9]*$"),
Validators.minLength(8),
]);
最も簡単な方法は、このようなライブラリを使用することです one 、具体的にはnoStrings
をtrueにしたい
export class CustomValidator{ // Number only validation
static numeric(control: AbstractControl) {
let val = control.value;
const hasError = validate({val: val}, {val: {numericality: {noStrings: true}}});
if (hasError) return null;
return val;
}
}
このような単純なものを試す方が簡単な場合があります。
validateNumber(control: FormControl): { [s: string]: boolean } {
//revised to reflect null as an acceptable value
if (control.value === null) return null;
// check to see if the control value is no a number
if (isNaN(control.value)) {
return { 'NaN': true };
}
return null;
}
お役に立てれば。
コメントごとに更新されました。このようにバリデーターを呼び出す必要があります
number: new FormControl('',[this.validateNumber.bind(this)])
Bind(this)は、コンポーネントにバリデーターを配置する場合に必要です。
カスタムバリデータで正規表現を使用する必要があります。たとえば、入力フィールドに9桁のみを許可するコードは次のとおりです。
function ssnValidator(control: FormControl): {[key: string]: any} {
const value: string = control.value || '';
const valid = value.match(/^\d{9}$/);
return valid ? null : {ssn: true};
}
こちらのサンプルアプリをご覧ください。