为什么要使用 Validators.compose()?
Why should I use Validators.compose()?
我有一个字段要用多个验证器验证。
使用模块驱动方法,代码如下所示:
this.exampleForm = this.fb.group({
date_start : [
'',
Validators.compose([
Validators.required,
Validators.pattern("[0-9]{2}-[0-9]{2}-[0-9]{4}")
])]
})
但我也可以在没有 Validators.compose() 的情况下这样写:
this.exampleForm = this.fb.group({
date_start : [
'',
[
Validators.required,
Validators.pattern("[0-9]{2}-[0-9]{2}-[0-9]{4}")
]
]
})
而且效果很好。我个人更喜欢第二个版本(没有 compose),更少的代码和更好的可读性。这就引出了一个问题,为什么我应该使用 Validators.compose()?
当我们创建 new FormControl/FormGroup/FormArray
(AbstractControl) - coerceToValidator
被调用。
function coerceToValidator(
validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null): ValidatorFn|
null {
const validator =
(isOptionsObj(validatorOrOpts) ? (validatorOrOpts as AbstractControlOptions).validators :
validatorOrOpts) as ValidatorFn |
ValidatorFn[] | null;
return Array.isArray(validator) ? composeValidators(validator) : validator || null;
}
export function composeValidators(validators: Array<Validator|Function>): ValidatorFn|null {
return validators != null ? Validators.compose(validators.map(normalizeValidator)) : null;
}
所以在我们将它传递给 AbstractControl 之前不需要编写验证器。
从现在开始 feat(forms): compose validator fns automatically if arrays
添加了 6/13/16,Validators.compose 是为了向后兼容。
我知道这是一个老问题,但最近的一次搜索发现了它。
您可能想要使用 Validators.compose()
的主要原因是重复使用多个验证器。假设您想检查一个值是否在 0 到 100 之间。第一次,您会写:
this.form = this.fb.group({
foo: [ 0, [ Validators.min(0), Validators.max(100)]]
});
现在假设您想在应用程序的多个位置执行此操作。为避免代码重复,您可以通过简单地从现有验证器组合创建自己的验证器,公开它并在您需要的任何地方重用它:
// custom-validators.ts
import { Validators } from '@angular/forms';
export class CustomValidators {
readonly betweenZeroHundred = Validators.compose([
Validators.min(0),
Validators.max(100),
]);
}
// form1
this.form = this.fb.group({
foo: [ 0, [CustomValidators.betweenZeroHundred()]]
});
// form2
this.form = this.fb.group({
bar: [ 100, [CustomValidators.betweenZeroHundred()]]
});
如今,使用扩展运算符,您可以获得类似的结果,而无需 compose()
:
export class CustomValidators {
readonly betweenZeroHundred = [Validators.min(0), Validators.max(100)];
}
this.form = this.fb.group({
bar: [ 100, [...CustomValidators.betweenZeroHundred, Validators.required]]
});
最后,问题在于哪种方法更适合您的团队和您的情况。
我有一个字段要用多个验证器验证。
使用模块驱动方法,代码如下所示:
this.exampleForm = this.fb.group({
date_start : [
'',
Validators.compose([
Validators.required,
Validators.pattern("[0-9]{2}-[0-9]{2}-[0-9]{4}")
])]
})
但我也可以在没有 Validators.compose() 的情况下这样写:
this.exampleForm = this.fb.group({
date_start : [
'',
[
Validators.required,
Validators.pattern("[0-9]{2}-[0-9]{2}-[0-9]{4}")
]
]
})
而且效果很好。我个人更喜欢第二个版本(没有 compose),更少的代码和更好的可读性。这就引出了一个问题,为什么我应该使用 Validators.compose()?
当我们创建 new FormControl/FormGroup/FormArray
(AbstractControl) - coerceToValidator
被调用。
function coerceToValidator(
validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null): ValidatorFn|
null {
const validator =
(isOptionsObj(validatorOrOpts) ? (validatorOrOpts as AbstractControlOptions).validators :
validatorOrOpts) as ValidatorFn |
ValidatorFn[] | null;
return Array.isArray(validator) ? composeValidators(validator) : validator || null;
}
export function composeValidators(validators: Array<Validator|Function>): ValidatorFn|null {
return validators != null ? Validators.compose(validators.map(normalizeValidator)) : null;
}
所以在我们将它传递给 AbstractControl 之前不需要编写验证器。
从现在开始 feat(forms): compose validator fns automatically if arrays
添加了 6/13/16,Validators.compose 是为了向后兼容。
我知道这是一个老问题,但最近的一次搜索发现了它。
您可能想要使用 Validators.compose()
的主要原因是重复使用多个验证器。假设您想检查一个值是否在 0 到 100 之间。第一次,您会写:
this.form = this.fb.group({
foo: [ 0, [ Validators.min(0), Validators.max(100)]]
});
现在假设您想在应用程序的多个位置执行此操作。为避免代码重复,您可以通过简单地从现有验证器组合创建自己的验证器,公开它并在您需要的任何地方重用它:
// custom-validators.ts
import { Validators } from '@angular/forms';
export class CustomValidators {
readonly betweenZeroHundred = Validators.compose([
Validators.min(0),
Validators.max(100),
]);
}
// form1
this.form = this.fb.group({
foo: [ 0, [CustomValidators.betweenZeroHundred()]]
});
// form2
this.form = this.fb.group({
bar: [ 100, [CustomValidators.betweenZeroHundred()]]
});
如今,使用扩展运算符,您可以获得类似的结果,而无需 compose()
:
export class CustomValidators {
readonly betweenZeroHundred = [Validators.min(0), Validators.max(100)];
}
this.form = this.fb.group({
bar: [ 100, [...CustomValidators.betweenZeroHundred, Validators.required]]
});
最后,问题在于哪种方法更适合您的团队和您的情况。