正数的自定义验证

时间:2016-06-29 11:56:16

标签: angular angular2-forms

我试图找到信息,如果有任何内置验证器,检查输入是否为正数?

我试图构建以下内容:

static nonZero(control:Control) {
    if (Number(control.value) < 0) {
        control.setErrors({nonZero: true})
    } else {
    control.setErrors(null)
    }
}

但是,我不知道如何在我的表单构建器中使用它:

this.form = _formBuilder.group({
            field:['', Validators.required]})

我做错了什么?

7 个答案:

答案 0 :(得分:4)

您可以通过利用Validators.compose方法以这种方式进行配置:

this.form = _formBuilder.group({
        field:['', Validators.compose([
                     Validators.required, nonZero ])
        ]});

这允许您为该字段定义两个同步验证器。

修改

我会以这种方式实现验证器:

static nonZero(control:Control):{ [key: string]: any; } {
  if (Number(control.value) < 0) {
    return {nonZero: true};
  } else {
    return null;
  }
}

答案 1 :(得分:3)

很少重构:

 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()] });

答案 2 :(得分:0)

我使用相同的撰写方法,但实现了一个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)
                    ])
                  ]
});

答案 3 :(得分:0)

您可以结合使用min Validator和正则表达式模式Validator:

 field: ['', [Validators.required, Validators.min(1), Validators.pattern('^(0|[1-9][0-9]*)$')]],

答案 4 :(得分:0)

您可以做类似的事情,

.js

  orderFormGroup = new FormGroup({
    weight: new FormControl('', [Validators.required, Validators.min(0)])
  });

这将允许小于和等于的零值,如果您想要大于零的值,则可以提及Validators.min(0.1)

.html

  <input type="number" step="0.1" name="orderWeight" formControlName="weight" max="35" min="0" class="clr-input form-control">

请注意,min="0"仅可确保前端的增加或减少不会超过0。实际的输入验证是在.js中处理的

答案 5 :(得分:0)

您还可以将内置验证器min与Number.MIN_VALUE结合使用以接受每个正值。

例如:

this.form = _formBuilder.group({
    field:['', [Validators.required, Validators.min(Number.MIN_VALUE)]]
});

答案 6 :(得分:-1)

wrapper.java.command=java
wrapper.java.command.loglevel=INFO
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=/opt/Final/lib/MyApp.jar
wrapper.java.library.path.1=../lib
wrapper.logfile=../logs/wrapper.log
wrapper.app.parameter.1=/opt/Final/lib/MyApp.jar  
wrapper.app.parameter.2=-c
wrapper.app.parameter.3=/opt/Final/lib/conf

这很容易!