Angular 获取7中formgroup上的验证程序列表
如何获取已应用于angular7中fromgroup、formcontrol或formarray的验证程序列表? 我找到了setValidators(-),但没有getValidators(-)。试试这个函数Angular 获取7中formgroup上的验证程序列表,angular,Angular,如何获取已应用于angular7中fromgroup、formcontrol或formarray的验证程序列表? 我找到了setValidators(-),但没有getValidators(-)。试试这个函数 invalidControls(form) { const invalid = []; const controls = form.controls; for (const name in controls) { if (controls[name].i
invalidControls(form) {
const invalid = [];
const controls = form.controls;
for (const name in controls) {
if (controls[name].invalid) {
invalid.push(name);
}
}
return invalid;
}
验证器只是一个函数。组成所有的验证器。当需要验证时,调用每个验证器函数。 您可以访问组成它们的函数,但不能访问每个函数,因为它们是通过闭包封装的 这是我从角源中发现的 无论何时创建FormControl或设置验证器,都会调用此函数
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;
}
composeValidators函数只是调用Validators.compose
组合方法本身
static compose(validators: (ValidatorFn|null|undefined)[]|null): ValidatorFn|null {
if (!validators) return null;
const presentValidators: ValidatorFn[] = validators.filter(isPresent) as any;
if (presentValidators.length == 0) return null;
return function(control: AbstractControl) {
return _mergeErrors(_executeValidators(control, presentValidators));
};
}
和执行官
function _executeValidators(control: AbstractControl, validators: ValidatorFn[]): any[] {
return validators.map(v => v(control));
}
如您所见,您无法访问它们。您可以使用此方法进行检查验证 .ts文件中的
getAllErrors(form: FormGroup): { [key: string]: any; } | null {
let hasError = false;
const result = Object.keys(form.controls).reduce((acc, key) => {
const control = form.get(key);
const errors = (control instanceof FormGroup)
? this.getAllErrors(control)
: control.errors;
if (errors) {
acc[key] = errors;
hasError = true;
}
return acc;
}, {} as { [key: string]: any; });
return hasError ? result : null;
}
<form id="form" [formGroup]="form" (ngSubmit)="ProjectSubmit(formProjectGeneralData.value,1)"
enctype="multipart/form-data">
<input type="text" formControlName="id" >
<span class="warning" *ngIf="getAllErrors(form)">
*required</span>
<input type="text" formControlName="name" >
<span class="warning" *ngIf="getAllErrors(form)">
*required</span>
</form>
.html文件中的
getAllErrors(form: FormGroup): { [key: string]: any; } | null {
let hasError = false;
const result = Object.keys(form.controls).reduce((acc, key) => {
const control = form.get(key);
const errors = (control instanceof FormGroup)
? this.getAllErrors(control)
: control.errors;
if (errors) {
acc[key] = errors;
hasError = true;
}
return acc;
}, {} as { [key: string]: any; });
return hasError ? result : null;
}
<form id="form" [formGroup]="form" (ngSubmit)="ProjectSubmit(formProjectGeneralData.value,1)"
enctype="multipart/form-data">
<input type="text" formControlName="id" >
<span class="warning" *ngIf="getAllErrors(form)">
*required</span>
<input type="text" formControlName="name" >
<span class="warning" *ngIf="getAllErrors(form)">
*required</span>
</form>
*必需的
*必需的
忽略我的风格
希望这会有帮助 但它不会返回任何验证器列表。它将返回所有应用了验证的FormControl。请查看以下主题:问候