【问题标题】:Angular Iterate over Reactive Form Controls and Subchildren etcAngular Iterate over Reactive Form Controls and Subchildren 等
【发布时间】:2020-04-17 17:00:56
【问题描述】:

我需要遍历 Formbuilder 中的所有控件,以及子表单构建器以清除验证器和 updateValueAndValidity。我怎样才能从这里更新答案?

Angular 2: Iterate over reactive form controls

Object.keys(this.form.controls).forEach(key => {
    this.form.controls[key].clearValidators();
    this.form.controls[key].updateValueAndValidity();
  });

这里的表单在表单构建器等中有表单构建器。上面的答案只影响顶级子级,不影响子级等

this.editSharedForm = this.formBuilder.group({
  'name': [null, [Validators.maxLength(50)]],
  'streetAddress': [null, [Validators.maxLength(50)]],
  'city': [null, [Validators.required,Validators.maxLength(200)]],
  'zipcode': [null, [Validators.maxLength(10)]],
  'phoneNumber': [null, [Validators.maxLength(50)]],
  'emailAddress': [null, [Validators.maxLength(50), Validators.email]],
  'addressChangeReason': this.formBuilder.group({
    'addressChangeReasonId': [null,  [Validators.required, Validators.min(1)]],
    'addressChangeReasonCode': [null, [Validators.required, Validators.maxLength(50)]],
    'addressChangeReasonDescription': [null, [Validators.required, Validators.maxLength(255)]]
  }),
  'addressSource': this.formBuilder.group({
    'sourceOfAddressId': [null, [Validators.required, validatorDropdown]],
    'sourceOfAddressCode': [null, [Validators.required, Validators.maxLength(50)]],
    'sourceOfAddressDescription': [Validators.required, Validators.maxLength(255)]]
  })
});

}

2) 此外,如果需要,我如何只针对 1 个子子项(例如 addressChange Reason)? 以下不工作

Object.keys(this.editSharedForm.get('addressChangeReason').controls).forEach(key => {
  this.editSharedForm.controls[key].clearValidators();
  this.editSharedForm.controls[key].updateValueAndValidity();
});

“AbstractControl”类型上不存在属性“控件”

【问题讨论】:

  • 你试过this.editSharedForm['controls'][key].clearValidators();
  • 好吧,我是基于这个有很多选票的答案,让我也试试你的方法stackoverflow.com/a/42235220/12555362
  • 或者你可以做this.editSharedForm.get(key).clearValidators();

标签: angular typescript angular-reactive-forms angular8


【解决方案1】:

因此,如果您想在每个嵌套的 FormControl 上调用 clearValidators 和 updateValueAndValidity,则必须遍历所有嵌套的 FormGroups 和 FormArrays。

正如您在这个快速示例中看到的那样,它非常简单:

clearValidators(formGroup: FormGroup| FormArray): void {
  Object.keys(formGroup.controls).forEach(key => {
    const control = formGroup.controls[key] as FormControl | FormGroup | FormArray;
    if(control instanceof FormControl) {
      console.log(`Clearing Validators of ${key}`);
      control.clearValidators();
      control.updateValueAndValidity()
    } else if(control instanceof FormGroup || control instanceof FormArray) {
      console.log(`control '${key}' is nested group or array. calling clearValidators recursively`);
      this.clearValidators(control);
    } else {
      console.log("ignoring control")
    }
  });

对于问题 2)

只需调用

clearValidators(this.editSharedForm.get('addressChangeReason'))

https://stackblitz.com/edit/angular-dzsrq8

【讨论】:

  • 太好了,我会看看这个,我怎样才能像问题 2 一样只针对下面的一个子表单生成器?
  • 只需拨打clearValidators(this.editSharedForm.get('addressChangeReason')
  • 嗨,winnen,您在 stackblitz 中尝试过答案的第二部分吗?接收错误类型抽象控件的参数不可分配给类型参数FormGroup FormArray,您可以尝试更新答案吗?另外我会给这个新方法一个新名称,所以它不会覆盖与原始名称碰撞,我给了点,无论如何,如果可以的话请修复,谢谢!
  • 也许将其命名为 clearValidatorsNested?您的电话,谢谢,请在您的 stackblitz 中尝试问题 2b,对我不起作用
  • 究竟是什么不起作用?你必须确保你的 AbstractControl 是 FormGroup 或 FormArray 使用类型断言。
猜你喜欢
  • 2019-12-26
  • 2018-06-10
  • 2018-06-26
  • 1970-01-01
  • 2018-07-01
  • 2018-05-07
  • 2018-08-11
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多