如何获取Angular FormControl的验证器及对应参数值?
判断Angular FormControl是否包含带参数的验证器并获取参数
对于Validators.required这类无参数的验证器,hasValidator方法可以直接判断,但像Validators.maxLength、Validators.minLength这类带参数的验证器,因为它们是工厂函数,每次调用都会返回新的函数引用,所以无法直接用hasValidator检测,需要通过以下方式处理:
方案一:利用原始验证器数组+函数解析(适合内置验证器)
Angular的FormControl内部会把传入的验证器数组存到私有属性_rawValidators中,我们可以通过它获取所有原始验证器,再结合函数的toString()解析参数:
import { FormControl, Validators, ValidatorFn } from '@angular/forms'; // 判断是否为maxLength验证器 function isMaxLengthValidator(validator: ValidatorFn): boolean { return (validator as any).__NG_VALIDATOR_ID__ === 'maxlength'; } // 获取maxLength验证器的参数值 function getMaxLengthValue(control: FormControl): number | null { // 获取原始验证器数组 const rawValidators = (control as any)._rawValidators as ValidatorFn[]; if (!rawValidators) return null; const maxValidator = rawValidators.find(validator => isMaxLengthValidator(validator)); if (!maxValidator) return null; // 解析函数字符串中的参数 const match = maxValidator.toString().match(/maxLength\((\d+)\)/); return match ? parseInt(match[1], 10) : null; } // 使用示例 const testControl = new FormControl(null, [ Validators.required, Validators.minLength(5), Validators.maxLength(20) ]); // 检测是否包含maxLength验证器 const hasMaxLength = !!getMaxLengthValue(testControl); console.log(hasMaxLength); // true // 获取最大长度值 const maxLength = getMaxLengthValue(testControl); console.log(maxLength); // 20
方案二:模拟验证场景获取参数(不依赖私有属性)
通过创建一个临时的、长度超出限制的控件值,执行验证器并提取错误信息中的参数,这种方式更稳妥,不依赖Angular内部私有属性:
import { FormControl, Validators, ValidatorFn } from '@angular/forms'; function getMaxLengthParams(control: FormControl): number | null { // 获取验证器(如果是复合验证器,需要分解) const getValidators = (validator: any): ValidatorFn[] => { if (Array.isArray(validator)) return validator; if (validator && validator._validators) return validator._validators; // 处理复合验证器 return validator ? [validator] : []; }; const validators = getValidators(control.validator); for (const validator of validators) { // 创建一个临时控件,值的长度故意超出maxLength限制 const tempControl = new FormControl('a'.repeat(100)); const errors = validator(tempControl); if (errors?.maxlength) { return errors.maxlength.requiredLength; } } return null; } // 使用示例 const testControl = new FormControl(null, [ Validators.required, Validators.minLength(5), Validators.maxLength(20) ]); const maxLength = getMaxLengthParams(testControl); console.log(maxLength); // 20 const hasMaxLength = maxLength !== null; console.log(hasMaxLength); // true
注意事项
- 方案一中的
_rawValidators是私有属性,未来Angular版本可能会变更,生产环境使用需谨慎; - 方案二更通用,不仅适用于内置验证器,也适用于自定义的带参数验证器,只要验证器返回的错误对象包含对应字段即可;
- 自定义验证器时,可以在验证器函数上挂载参数属性,方便直接获取,比如:
function customMinLength(min: number): ValidatorFn { const validator = (control: FormControl) => { return control.value?.length < min ? { customMinLength: { requiredLength: min } } : null; }; // 挂载参数到函数上 (validator as any).requiredLength = min; return validator; } // 使用时直接获取:validator.requiredLength
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

