Angular2反应形式:将FormArray与父FormGroup同步
我使用formarray来处理可变长度的对象数组。虽然我当前的实现基本上是有效的,但在进行验证时我遇到了一个问题,因为对我的FormArray所做的任何更改都不会传播到它的“父”FormGroup。。。或者,通过更改由所述FormGroup管理的另一个控件的值,FormGroup的值至少不会自动更新 在这一点上,我无法判断我的实现是否有问题,或者我是否期待一些我不应该。。。不管最后的“问题”是什么,我很乐意接受任何意见 链接到Plunker: (角度版本为2.0.1) Plunker中app.ts顶部的评论详细说明了重现问题的步骤(或者对我来说是什么问题) 由于SO在链接到Plunker时需要一些代码,以下是与FormGroup和FormArray定义相关的行Angular2反应形式:将FormArray与父FormGroup同步,angular,typescript,angular2-forms,Angular,Typescript,Angular2 Forms,我使用formarray来处理可变长度的对象数组。虽然我当前的实现基本上是有效的,但在进行验证时我遇到了一个问题,因为对我的FormArray所做的任何更改都不会传播到它的“父”FormGroup。。。或者,通过更改由所述FormGroup管理的另一个控件的值,FormGroup的值至少不会自动更新 在这一点上,我无法判断我的实现是否有问题,或者我是否期待一些我不应该。。。不管最后的“问题”是什么,我很乐意接受任何意见 链接到Plunker: (角度版本为2.0.1) Plunker中app.t
this.form = this.fb.group({
"size":[0, Validators.required],
"someArray": this.fb.array(this.initFormArray(0), Validators.required),
"someOtherField":[null]
});
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
newFormArray.push(this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}));
}
return newFormArray;
}
updateFormArray(value:string){
let newSize:number = parseInt(value) ;
if(newSize >= 0){
this.form.controls["someArray"] = this.fb.array(this.initFormArray(newSize))
this.form.updateValueAndValidity();
}
}
感谢所有打电话进来的人:)
编辑(2016-10-11):玩弄值更改
钩子更多让我几乎解决了问题,但解决方案并不令人满意。出于这个原因,我正在编辑而不是回答我自己的问题,但如果任何国防部认为这是一个有效的结论,请尽一切努力做你认为足够的
至于我的“解决方案”:我没有在FormArray或根FormGroup级别订阅valueChanges
,而是订阅组成FormArray的每个FormGroup的valueChanges
可观察到的内容,几乎可以实现我想要的:
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
let formGroup = this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}) ;
formGroup.valueChanges.subscribe((data) => this.form.updateValueAndValidity());
newFormArray.push(formGroup);
}
return newFormArray;
有没有办法在不使用setTimeout的情况下进行管理
更新的Plunker:我玩了一些你的Plunker,发现了问题 更改了新的
FormArray
的大小后,当您分配新的FormArray
时,您只分配了它,而没有将它正确地关联到父FormGourp
使用
this.form.controls[]=newformcontrol/FormArray/FormGroup
不将父属性应用于新控件。
这就是为什么在更新一个父字段时“刷新”整个表单值之前,这些值不会传播到父字段
您可以在中看到,为了更好地理解,我添加了一些console.log
s
我还添加了正确的方法(我认为)来替换someArray
FormArray的值。
使用计算机帮助很大
希望这有帮助每当嵌套表单数组发生更改时,我都会遇到更新父表单组的问题。每当表单数组更改时,尝试设置父属性。希望能有帮助
addItem(): void {
let fa = <FormArray>this.formGroup.get(this.formProperty)
let fb = this.CreateNewRow(this.schema);
fb.setParent(fa);
fa.controls.push(fb);
}
addItem():void{
让fa=this.formGroup.get(this.formProperty)
设fb=this.CreateNewRow(this.schema);
fb.setParent(fa);
fa.控制按钮(fb);
}
非常感谢您的意见!考虑到我接近我要找的东西,我甚至没有尝试去摆弄setControl、setValue和patchValue。。。我真丢脸;)起初,您提供的plunker不起作用,但通过添加到文档的链接,我能够完全实现我想要的(使用setControl):您的解决方案@phl的唯一问题是,如果您在添加一些值后更新大小,formArray将被替换为当前值。我添加了一个具有持久性的解决方案,以防有人想保留当前值
formGroup.valueChanges.subscribe((data) => setTimeout(()=>this.form.updateValueAndValidity(), 1);
addItem(): void {
let fa = <FormArray>this.formGroup.get(this.formProperty)
let fb = this.CreateNewRow(this.schema);
fb.setParent(fa);
fa.controls.push(fb);
}