当 Reactive Form 中需要所有表单字段时,我们如何设置 Validators.required 一次?

How can we set Validators.required once when all form field are required in Reactive Form?

angular v 4.4.3.

在 Reactive Form 中,我们可以在每个表单字段中编写 Validators.required,如下所示

this.loginForm = this.fb.group({
                firstName: ['', [Validators.required, Validators.maxLength(55)]],
                lastName: ['', Validators.required],
                age: [1, Validators.required],
                email: ['', Validators.required],
                username: ['', Validators.required],
                gender: ['', Validators.required],
                address: this.fb.group({
                    city: ['', Validators.required],
                    country: ['', Validators.required]
                })
            });

这里我们需要在每个表单域上写Validators.required

所以我正在寻找 angular FormBuilder/FormControl 中的任何 solution/method,它设置了所有必需的字段,并且可以根据需要在该字段上设置附加验证器。

您可以编写一个函数来深度迭代 FormGroupFormArray:

deepIterate(control: FormGroup | FormArray, iteratee: (control) => void): void {
    _.forEach(control.controls, control => {
        if (control instanceof FormControl) {
            iteratee(control);
        } else if (control instanceof FormGroup || control instanceof FormArray) {
            FormUtils.deepIterate(control, iteratee);
        }
    });
}

现在要为每个 FormControl 添加 required 验证器,您可以使用此功能:

addRequiredValidators(control: FormGroup | FormArray): void {
    deepIterate(
        control,
        (control) => control.setValidators(Validators.compose([Validators.required, control.validator]))
    );
}

您可以在创建 FormGroup 后调用 addRequiredValidators

您可以为整个表单创建一个 customValidator,

this.form = this.fb.group({
  firstName: ['', [Validators.maxLength(55)]],
  ....
},
{
   validator: this.myValidator()
});


myValidator()
{
return (group: FormGroup) => {
    let errors:any={};
    let conError:boolean=false;
    if (!group.value.firstName)
    {
         errors.requiredFirstName=true;
         conError=true;
    }
     ....
    return conError? errors:null
  }
}

//.html 变成像

<form [formGroup]="form " (ngSubmit)="onSubmit()">
    <div class="form-group">
         <label for="firstName">UserName</label>
         <input type="text" class="form-control"
             id="firstName" formControlName = "firstName">
     <!--see that we ask about form?.errors?requiredFirsName 
          requiredFirsName is the property we add to errors
         we add the condition is touched too 
         because else, at first, Angular show the error-->
             <span class="help-block" *ngIf="form?.errors?.requiredFirstName && 
     form.get('firstName').touched ">First Name required</span>
    </div>
    ....
   <!--just for check -->
   {{form?.errors |json}}
</form>

采用干净的方法。

[{
  "firstname": ""
  "required": "true/false",
  "pattern" :""
},
{
  "lastname": ""
  "required": "true/false",
  "pattern" :""
}]

创建包含必填字段/子字段的数组。对该数组执行 for each 循环并创建表单控件。

例如:

或者如果您只关心 Validator.required - 那么@Ludevik 的答案是最好的选择,但是对于 angular 来说这将是额外的工作 - 首先你定义表单控件然后你定义Validator.required