循环使用Angular中FormGroup中的子AbstractControl列表

时间:2017-07-20 08:50:57

标签: javascript angular typescript angular-reactive-forms

以下是在显示验证错误之前,尝试确定AbstractControl中的每个FormGroup是否为pristine的组件代码:



export class FieldErrorsComponent {
  @Input() control: AbstractControl | FormGroup;

  public controlsAreNotPristine(): boolean {
    if (this.control instanceof FormGroup) {
      return ((this.control as FormGroup).controls.every(control => !control.pristine));
    }
  }
}




当然,这不起作用,因为FromGroup.controls的定义如下:

controls: { [key: string]: AbstractControl; };

我不知道在controls上循环的好方法是什么?真正的问题是FormGroup.pristine并没有真正反映其子控件总和的值,我理解这可能是通过设计实现的。

1 个答案:

答案 0 :(得分:2)

FormGroup并未提供任何迭代器can be seen from its interface。但它提供了对控件的访问,这些控件的定义如下:

controls: {[key: string]: AbstractControl}

因此,您可以使用标准for in循环来迭代它们:

  public controlsAreNotPristine(): boolean {
    if (this.control instanceof FormGroup) {
      const controls = (this.control as FormGroup).controls
      for (const name in controls) {
         if (controls[name].pristine) {
            return true;
         }
      }
       return false;
    }
  }
  

真正的问题是FormGroup.pristine并没有真正反映出来   它理解的子控件总和的值   通过设计制作。

FormGroup应正确反映其子控件的状态。这可以从FormGroup上的_updatePristine方法看出:

  _updatePristine(opts: {onlySelf?: boolean} = {}): void {
    this._pristine = !this._anyControlsDirty(); <------- ensure all controls are pristine

    if (this._parent && !opts.onlySelf) {
      this._parent._updatePristine(opts);
    }
  }