如何在 Angular Reactive Forms 中执行 required-if ?

Jon*_*Sud 16 javascript typescript angular angular-reactive-forms

我有一个反应式表单,并根据fooRequired我想要将字段设置为必填或非必填的属性。

我无法更改它,因为它是初始设置的。那我能做什么呢?

fooRequired = false;

form = new FormGroup({
 foo: new FormControl(null, [Validators.required])
});

toggle() { this.fooRequired = !this.fooRequired; }
Run Code Online (Sandbox Code Playgroud)

Nic*_*s K 21

下面的方法可以解决这个问题:

toggle() {
  this.fooRequired = !this.fooRequired;
  this.form.controls.foo.setValidators(this.fooRequired ? null : [Validators.required]);
  this.form.controls.foo.updateValueAndValidity();
}
Run Code Online (Sandbox Code Playgroud)

在这里,根据fooRequired布尔值,设置或删除验证器。最后,更新了新的表单控件设置。


Elm*_*hdi 8

您可以使用自定义函数来负责添加或删除Validators

export function conditionalValidator(
  predicate: BooleanFn,
  validator: ValidatorFn,
  errorNamespace?: string
): ValidatorFn {
  return formControl => {
    if (!formControl.parent) {
      return null;
    }
    let error = null;
    if (predicate()) {
      error = validator(formControl);
    }
    if (errorNamespace && error) {
      const customError = {};
      customError[errorNamespace] = error;
      error = customError;
    }
    return error;
  };
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在表单控件中使用它:

this.myForm = this.fb.group({
  myEmailField: [
    "",
    [
      // some normal validatiors
      Validators.maxLength(250),
      Validators.minLength(5),
      Validators.pattern(/.+@.+\..+/),
      // custom validation
      conditionalValidator(
        // depends on fooRequired value
        () => this.fooRequired,
        Validators.required,
        "illuminatiError"
      )
    ]
  ]
});
Run Code Online (Sandbox Code Playgroud)

最后您可以切换 的值fooRequired并查看结果:

  toggle() {
    this.fooRequired = !this.fooRequired;
    this.myForm.get("myEmailField").updateValueAndValidity();
  }
Run Code Online (Sandbox Code Playgroud)

这是一个现场演示,可以帮助您实现上述答案