首页 文章

Angular2表单中的自定义验证

提问于
浏览
4

按照这里的例子:

https://angular.io/docs/ts/latest/guide/forms.html

我的表格如下:

<input type="text" class="form-control" id="name"
               required
               [(ngModel)]="model.name" name="name"
               #name="ngModel" >
        <div [hidden]="name.valid || name.pristine" 
             class="alert alert-danger">

我想为此表单添加一些自定义验证 . 我确实找到了一些关于使用ngFormModel和FormBuilders和Validation类的建议,但是我相信这些已经过时了,不再推荐

http://almerosteyn.com/2016/03/angular2-form-validation-component

那么我的问题是如何添加自定义验证 .

在angular 1.x中,我曾经将函数添加到ngModel . $ parsers和ngModel . $ formatters管道 . 角度2的等价物是多少?

1 回答

  • 1

    我是通过使用模型驱动的方法而不是模板驱动的方法来实现的 . 例如:

    Form

    <form [formGroup]="myForm">
        <label for="id-name">Name</label>
        <input type="text" id="id-name" formControlName="name">
        <label for="id-age">Age</label>
        <input type="text" id="id-age" formControlName="age">
    </form>
    

    Component

    export class MyComponent implements OnInit {
        myForm:FormGroup;
    
        ngOnInit() {
            let fuv = FormUtils.validators;
    
            this.myForm = this.formBuilder.group({
                name: ['', Validators.required],
                age: ['', [Validators.required, fuv.isNumber]],
            });
        }
    }
    

    FormUtils

    type ValidatorResult = {[key:string]:any};
    
    function _isNumber(control:AbstractControl):ValidatorResult {
        let v = control.value;
        if (isPresent(v) && !isNumber(v) && !isEmptyString(v)) {
            return {'isNumber': false};
        }
        return null;
    }
    
    export class FormUtils {
          static validators = {
            isNumber: _isNumber
          }
    }
    

    这里, isPresentisNumberisEmptyString 非常简单:

    isPresent(obj) --> return obj !== undefined && obj !== null;
    isNumber(obj) --> return (typeof obj === 'number' && !isNaN(obj));
    isEmptyString(obj) --> return obj === '';
    

    目前,Angular 2为您提供了四个有用的验证器: requiredminLengthmaxLengthpattern . 最后一个非常强大 . 您可以按照与上面的 _isNumber 类似的模式编写自己的验证器 . 如果您的验证器需要参数(例如 lessThan ),那么您可以使用与此类似的模式:

    function lessThan(maxVal:number):ValidatorFn {
        return (control:AbstractControl):ValidatorResult => {
            let value = control.value;
    
            if (isPresent(value) && !isEmptyString(value) && isNumber(value) && parseInt(value) >= maxValue) {
                return {'lessThan': {'maxValue': maxValue, 'actual': value}};
            }
    
            return null;
        };
    }
    

    我知道这种方法(模型驱动)与您在问题中发布的形式(模板驱动)不同 . 无论如何,我希望它有所帮助 .

相关问题