以下是组件的代码,该组件尝试在显示验证错误之前确定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
不能真正反射(reflect)其子控件总和的值,我知道这可能是设计使然。 最佳答案
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应该正确反射(reflect)其子控件的状态。从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);
}
}
关于javascript - 在Angular的FormGroup中的子AbstractControl列表上循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45209841/