【发布时间】:2018-01-21 11:52:39
【问题描述】:
我的响应式表单是三个组件级别的深度。父组件创建一个没有任何字段的新表单并将其传递给子组件。
起初外部形式是有效的。稍后,子组件会添加带有验证器(失败)的新表单元素,从而使外部表单无效。
我在控制台中收到 ExpressionChangedAfterItHasBeenCheckedError 错误。我想修正那个错误。
不知何故,这只发生在我添加第三层嵌套时。同样的方法似乎适用于两层嵌套。
Plunker: https://plnkr.co/edit/GymI5CqSACFEvhhz55l1?p=preview
父组件
@Component({
selector: 'app-root',
template: `
myForm.valid: <b>{{myForm.valid}}</b>
<form>
<app-subform [myForm]="myForm"></app-subform>
</form>
`
})
export class AppComponent implements OnInit {
...
ngOnInit() {
this.myForm = this.formBuilder.group({});
}
}
子组件
@Component({
selector: 'app-subform',
template: `
<app-address-form *ngFor="let addressData of addressesData;"
[addressesForm]="addressesForm">
</app-address-form>
`
})
export class SubformComponent implements OnInit {
...
addressesData = [...];
constructor() { }
ngOnInit() {
this.addressesForm = new FormArray([]);
this.myForm.addControl('addresses', this.addressesForm);
}
子组件
@Component({
selector: 'app-address-form',
template: `
<input [formControl]="addressForm.controls.addressLine1">
<input [formControl]="addressForm.controls.city">
`
})
export class AddressFormComponent implements OnInit {
...
ngOnInit() {
this.addressForm = this.formBuilder.group({
addressLine1: [
this.addressData.addressLine1,
[ Validators.required ]
],
city: [
this.addressData.city
]
});
this.addressesForm.push(this.addressForm);
}
}
【问题讨论】:
-
我在过去 24 小时内访问了该页面 5 次 ;)。仍然不确定如何解决它。
-
你引用的 plunker 没有错误
-
很奇怪。在禁用所有扩展程序的情况下,我在 Chrome 和 Firefox 中都遇到了错误。在 Plunker 和 localhost 中。添加了截图供参考。
-
我在使用 plunk 时遇到错误。我删除了地址表单组件中的验证(
[ Validators.required ]),错误消失了。不确定这些信息是否有用。
标签: javascript forms angular