Пользовательская проверка положительных чисел


Я пытался найти информацию, если есть какие-либо встроенные валидаторы, которые проверяют, является ли вход положительным числом?

Я пытался построить следующее:

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 3

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)
                    ])
                  ]
});
<input type="number" ng-model="size" name="size" min="0" max="10" integer />

Вот так просто!