gpt4 book ai didi

angular - Angular2 表单中的自定义验证

转载 作者:太空狗 更新时间:2023-10-29 17:59:47 24 4
gpt4 key购买 nike

按照这里的例子:

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 管道添加函数。 angular 2 的等价物是什么?

最佳答案

我通过使用模型驱动的方法而不是模板驱动来做到这一点。例如:

表单

<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>

组件

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;
};
}

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

关于angular - Angular2 表单中的自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com