无法删除 FormArray 中 FormGroup 内的动态验证器 - Angular

问题描述 投票:0回答:1

要在表单数组中的表单组内设置验证器,我尝试了此链接中描述的方法:

无法在 FormArray 中的 FormGroup 内设置动态验证器 - Angular

我试过了,它非常适合添加验证器,但它不适用于删除它们。

我试过 remove validators 方法和 clear validators 方法,但它们不起作用。

// let groupItems:any = (this.formGroup.get("address") as FormArray).controls;

const groupItems: any = (address as FormArray).controls;

  for (const item of groupItems) {
    item.controls.city.clearValidators();
    item.controls.state.clearValidators();
  }

在 formGroup 中删除 formArray 的动态验证器的方法是什么?

更新

我尝试添加`updateValueAndValidity(),但它给了我一个堆栈错误:

    for (const item of groupItems) 
        item.controls.city.clearValidators();
        item.controls.city.updateValueAndValidity();
        item.controls.state.clearValidators();
        item.controls.state.updateValueAndValidity();
      }

我加了

updateValueAndValidity()
,但是没用。它给了我一个堆栈错误。
所以:
避免 LoggingService: Maximum call stack size exceeded while using
updateValueAndValidity({ onlySelf: true, emitEvent: false })
; 我向选择器添加了一个侦听器,它使用
take(1)
rxJS 管道触发验证更改,并像这样设置验证:

          Selector?.valueChanges
      .pipe(take(1))
      .subscribe(SelectorRes => {
        if (SelectorRes === true) {
          const groupItems: any = (address as FormArray)
            .controls;

          for (const item of groupItems) {
            item.controls.city.setValidators(
              Validators.required
            );
            item.controls.city.updateValueAndValidity({
              onlySelf: true,
              emitEvent: false
            })
            item.controls.state.setValidators(Validators.required);
            item.controls.state.updateValueAndValidity({
              onlySelf: true,
              emitEvent: false
            })
          }

           address?.updateValueAndValidity({
            onlySelf: true,
            emitEvent: false
          });

          //   !was
          console.log('call validation 1');
        } else if (
          SelectorRes === false
        ) {
          const groupItems: any = (address as FormArray)
            .controls;

          for (const item of groupItems) {
            item.controls.city.clearValidators();
            item.controls.city.updateValueAndValidity()
            item.controls.state.clearValidators();
            item.controls.state.updateValueAndValidity();
          }

          //   !was
          console.log('delete validation 2');
        }
      });

有效,但一次更改调用太多次,我认为:

  • (209) 调用验证 1 -- foo.validator.ts
  • (19) 删除验证 2 -- foo.validator.ts
angular angular-reactive-forms angular-forms formarray formgroups
1个回答
0
投票

根据Angular文档

在运行时添加或删除验证器时,必须调用 updateValueAndValidity() 以使新验证生效。

你可以这样做:

const groupItems: any = (address as FormArray).controls;

  for (const item of groupItems) {
    item.controls.city.clearValidators();
    item.controls.city.updateValueAndValidity();
    item.controls.state.clearValidators();
    item.controls.state.updateValueAndValidity();
  }
© www.soinside.com 2019 - 2024. All rights reserved.