Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular2反应形式:将FormArray与父FormGroup同步_Angular_Typescript_Angular2 Forms - Fatal编程技术网

Angular2反应形式:将FormArray与父FormGroup同步

Angular2反应形式:将FormArray与父FormGroup同步,angular,typescript,angular2-forms,Angular,Typescript,Angular2 Forms,我使用formarray来处理可变长度的对象数组。虽然我当前的实现基本上是有效的,但在进行验证时我遇到了一个问题,因为对我的FormArray所做的任何更改都不会传播到它的“父”FormGroup。。。或者,通过更改由所述FormGroup管理的另一个控件的值,FormGroup的值至少不会自动更新 在这一点上,我无法判断我的实现是否有问题,或者我是否期待一些我不应该。。。不管最后的“问题”是什么,我很乐意接受任何意见 链接到Plunker: (角度版本为2.0.1) Plunker中app.t

我使用formarray来处理可变长度的对象数组。虽然我当前的实现基本上是有效的,但在进行验证时我遇到了一个问题,因为对我的FormArray所做的任何更改都不会传播到它的“父”FormGroup。。。或者,通过更改由所述FormGroup管理的另一个控件的值,FormGroup的值至少不会自动更新

在这一点上,我无法判断我的实现是否有问题,或者我是否期待一些我不应该。。。不管最后的“问题”是什么,我很乐意接受任何意见

链接到Plunker: (角度版本为2.0.1)

Plunker中app.ts顶部的评论详细说明了重现问题的步骤(或者对我来说是什么问题)

由于SO在链接到Plunker时需要一些代码,以下是与FormGroup和FormArray定义相关的行

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);
  }