如何在 formBuilder Angular 中添加条件验证器

Dan*_*eve 4 forms angular angular-reactive-forms

在使用 formBuilder 和 ReactiveForms 的 Angular 7.x 中,我尝试将验证器放入基于用户角色的表单中。因此,当用户有不同的 时role,他/她需要输入一个字段。我将该用户存储在类中存储的变量中。

我不想将验证器放在 valueChange 的订阅上,而是放在初始构建上。我怎样才能做到这一点?下面是一些代码。

 buildForm(): void {
    this.accountForm = this.formBuilder.group({
      firstName: [this.user.firstName, Validators.required],
      initials: [this.user.initials, Validators.required],
      lastNamePrefix: [this.user.lastNamePrefix],
      lastName: [this.user.lastName, Validators.required],
      cellPhoneNumber: [this.user.cellPhoneNumber], <-- make this one required if the role of the user is x
      ]),
    });
  }
Run Code Online (Sandbox Code Playgroud)

Jot*_*edo 8

假设设置验证器后用户的角色不会改变,方法如下:

import {ValidatorFn, Validators} from '@angular/forms';

function createCellPhoneValidator(user: FooUser): ValidatorFn {
  return user.role === x ? Validators.required : Validators.nullValidator;
}

export class FooComponent {
  buildForm(): void {
    this.accountForm = this.formBuilder.group({
      firstName: [this.user.firstName, Validators.required],
      initials: [this.user.initials, Validators.required],
      lastNamePrefix: [this.user.lastNamePrefix],
      lastName: [this.user.lastName, Validators.required],
      cellPhoneNumber: [this.user.cellPhoneNumber, createCellPhoneValidator(this.user)],
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

如果角色可以更改,那么您每次在执行验证之前都需要重新评估角色。这可以这样做:

import {ValidatorFn, Validators} from '@angular/forms';

export class FooComponent {
  buildForm(): void {
    this.accountForm = this.formBuilder.group({
      firstName: [this.user.firstName, Validators.required],
      initials: [this.user.initials, Validators.required],
      lastNamePrefix: [this.user.lastNamePrefix],
      lastName: [this.user.lastName, Validators.required],
      cellPhoneNumber: [this.user.cellPhoneNumber, this.cellPhoneValidator],
    });
  }

  private readonly cellPhoneValidator: ValidatorFn = c => {
     return this.user.role === "x" ? Validators.required(c) : Validators.nullValidator(c);
   }
}
Run Code Online (Sandbox Code Playgroud)