看起来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);
}
只会更新"学生"中的第一个元素但它不会插入第二个元素。
我需要做些什么才能让它显示两个元素?
答案 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: ''
});
}