Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 获取7中formgroup上的验证程序列表_Angular - Fatal编程技术网

Angular 获取7中formgroup上的验证程序列表

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

如何获取已应用于angular7中fromgroup、formcontrol或formarray的验证程序列表? 我找到了setValidators(-),但没有getValidators(-)。

试试这个函数

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。请查看以下主题:问候