Angular2 patchValue将值推入数组

时间:2016-12-01 16:47:55

标签: angular typescript angular2-forms

看起来Angular2的FormGroup.patchValue()并没有将新元素推入数组。

例如:

ngOnInit() {

    this.form = this.formBuilder.group({
        animal: [''],
        school: this.formBuilder.group({
            name: [''],
        }),
        students: this.formBuilder.array([this.formBuilder.control('Bob')])
    });

    setTimeout(() => this.form.patchValue({
      animal: 'cat'
      school : {name: 'Fraser'},
      students: ['Bob gets edited', 'This will not show']
    }), 250);

}

只会更新"学生"中的第一个元素但它不会插入第二个元素。

我需要做些什么才能让它显示两个元素?

Plunker here

4 个答案:

答案 0 :(得分:16)

好吧,正如沉默说的那样,这是不可能的。目前,我正在使用以下作为替代方案:

        let controlArray = <FormArray>this.form.controls['apps'];           
        this.list.forEach(app => {
                    const fb = this.buildGroup();
                    fb.patchValue(app);
                    controlArray.push(fb);
            });

Angular Team - 我们需要一个像PatchArray()这样的新函数来修补集合/对象图。这是一个基本用例。

答案 1 :(得分:9)

.patchValue()仅更新现有的FormArray,不会修改表单模型的结构。

  

patchValue(value:any [],{onlySelf,emitEvent}?:{onlySelf?:boolean,   emitEvent?:boolean}):void修补FormArray的值。它   接受一个与控件结构匹配的数组,并且会   尽力将值与组中正确的控件匹配。

     

它接受数组的超集和子集而不抛出   错误。

你实际上需要一个新元素推送到数组上才能显示它。

 this.form.controls['students'].push(new FormControl('This will not show'));

这一切都在FormArray文档https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html

答案 2 :(得分:5)

嗯,我发现的解决方案是:

this.myForm.controls['array'] = this.formBuilder.array(newArray.map(i => this.formBuilder.group(i)));

答案 3 :(得分:0)

我希望这会对你有所帮助。我有一个复杂的对象,我的对象里面有一个对象,里面有对象。对不起我的语法。但我希望我的代码可以帮助你

ngOnInit() {
    this.descriptifForm = this._fb.group({
      name: 'ad',
      descriptifs: this._fb.array([ this.buildForm() ]),
    });

    this._service.getData().subscribe(res => {
      this.descriptifForm.setControl('descriptifs', this._fb.array(res || []));
    });

  }
buildA(): FormGroup {
    return this._fb.group({
      Id: '',
      Groups: this._fb.array([ this.buildB() ]),
      Title: ''
    });
  }

  buildB(): FormGroup {
    return this._fb.group({
      Id: '',
      Fields: this._fb.array([ this.bbuildC() ]),
      Type: ''
    });
  }

  buildC(): FormGroup {
    return this._fb.group({
      Answers: this._fb.array([ this.buildD() ]),
      Code: '',
    });
  }

  buildD(): FormGroup {
    return this._fb.group({
      Data: ''
    });
  }