以下是在显示验证错误之前,尝试确定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
并没有真正反映其子控件总和的值,我理解这可能是通过设计实现的。
答案 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);
}
}