Пользовательская проверка положительных чисел
Я пытался найти информацию, если есть какие-либо встроенные валидаторы, которые проверяют, является ли вход положительным числом?
Я пытался построить следующее:
static nonZero(control:Control) {
if (Number(control.value) < 0) {
control.setErrors({nonZero: true})
} else {
control.setErrors(null)
}
}
Однако я не знал, как использовать его в моем построителе форм:
this.form = _formBuilder.group({
field:['', Validators.required]})
Что я делаю не так?
4 ответа:
Вы можете настроить его таким образом, используя метод
Validators.compose
:this.form = _formBuilder.group({ field:['', Validators.compose([ Validators.required, nonZero ]) ]});
Это позволяет определить два синхронных валидатора для данного поля.
Edit
Я бы реализовал валидатор следующим образом:
static nonZero(control:Control):{ [key: string]: any; } { if (Number(control.value) < 0) { return {nonZero: true}; } else { return null; } }
Немного преломлено:
export function positiveNumberValidator(): ValidatorFn { return (control: AbstractControl): { [key: string]: any } => { const isNotOk = Number(control.value) < 0; return isNotOk ? { nonPositive: { value: control.value } } : null; }; }
И если вы хотите использовать его в шаблоне как
Directive
:import { Directive, Input } from '@angular/core'; import { ValidatorFn, AbstractControl, NG_VALIDATORS, Validator } from '@angular/forms'; @Directive({ selector: '[prePositiveNumber]', providers: [{ provide: NG_VALIDATORS, useExisting: PositiveNumberDirective, multi: true }] }) export class PositiveNumberDirective implements Validator { validate(c: AbstractControl): { [key: string]: any; } { return positiveNumberValidator()(c); } } export function positiveNumberValidator(): ValidatorFn { return (control: AbstractControl): { [key: string]: any } => { const isNotOk = Number(control.value) < 0; return isNotOk ? { nonPositive: { value: control.value } } : null; }; }
Шаблон:
<input type="number" class="full" name="shipmentVolume" required prePositiveNumber [(ngModel)]="someModel" />
При использовании в качестве
Reactive forms
валидаторов можноcompose
, но также можно использовать и безcompose
:this.form = _formBuilder.group({ field:['', Validators.required, positiveNumberValidator()] });
Я бы использовал ту же методику составления, но реализовал бы функцию min, которую вы тоже можете передать 1.
import { ValidatorFn, AbstractControl } from '@angular/forms'; export function min(min: Number): ValidatorFn { return (control: AbstractControl): {[key: string]: any} => { const input = control.value, isValid = input < min; if(isValid) return { 'minValue': {min} } else return null; }; }
this.pnFG = this.fb.group({ pageNumberInput: [this.pageNumber, Validators.compose([ Validators.required, min(1) ]) ] });