根据API文档,更改嵌套值的正确方法是使用方法patchValue
myForm.patchValue({'key': {'subKey': 'newValue'}});
但是如何更改嵌套数组中的值,例如下面这个例子中的 list 。如何将列表数组的第一项更改model
更改为Fiesta
? Plunker
myForm.patchValue({'list': 0: {'model': 'Fiesta'});
无效。
@Component({
moduleId: __moduleName,
selector: 'my-app',
template: `<div><pre>{{ myForm.value | json }}</pre></div>`
})
export class AppComponent {
public myForm: FormGroup;
constructor(@Inject(FormBuilder) private _fb: FormBuilder) {
this.myForm = this._fb.group({
name: 'Cars',
list: this._fb.array([
this.initCar(),
this.initCar(),
this.initCar()
]),
});
/** Change value Here **/
this.myForm.patchValue({name: 'Automobile'});
};
initCar() {
return this._fb.group({
automaker: 'Ford',
model: 'Fusion'
});
}
}
答案 0 :(得分:2)
我做了类似的事情,很久以前只是添加。
const patchV = (<FormArray>this.myForm.controls['list']).at(0) as FormArray;
patchV.patchValue({automaker: 'CoolCar', model: 'Bucket'})
工作示例[plunker] http://embed.plnkr.co/VWicnA/
答案 1 :(得分:1)
这是一种在Angular 2中访问和修补FormArray的方法。我已经修改了你的代码,以便使用你的Plunk使其工作。
import { Inject, Component } from '@angular/core';
import { FormBuilder, FormArray } from '@angular/forms';
@Component({
moduleId: __moduleName,
selector: 'my-app',
template: `<div><pre>{{ myForm.value | json }}</pre></div>`
})
export class AppComponent {
public myForm: FormGroup;
constructor(@Inject(FormBuilder) private _fb: FormBuilder) {
this.myForm = this._fb.group({
name: 'Cars',
list: this._fb.array([
this.initCar(),
this.initCar(),
this.initCar()
]),
});
this.myForm.patchValue({name: 'Automobile'});
/** Make changes here ***/
// access the array from the form
var items = this.myForm.get('list');
// change the first item
items.patchValue([{
model: 'Fiesta'
}]);
// change the second item (notice the comma in front of the array)
items.patchValue([,
{
model: 'TLX',
automaker: 'Acura'
}]);
// change the third item (notice the 2 commas in front of the array)
items.patchValue([,,
{
model: 'Accord',
automaker: 'Honda'
}]);
};
initCar() {
return this._fb.group({
automaker: 'Ford',
model: 'Fusion'
});
}
}
之前的输出:
{
"name": "Automobile",
"list": [
{
"automaker": "Ford",
"model": "Fusion"
},
{
"automaker": "Ford",
"model": "Fusion"
},
{
"automaker": "Ford",
"model": "Fusion"
}
]
}
输出之后:
{
"name": "Automobile",
"list": [
{
"automaker": "Ford",
"model": "Fiesta"
},
{
"automaker": "Acura",
"model": "TLX"
},
{
"automaker": "Honda",
"model": "Accord"
}
]
}
编辑:更好的解决方案:
// access the array from the form
var items = this.myForm.get('list');
const item1 = (items).at(0);
// change the first item
item1.patchValue({model: 'Fiesta'});
// change the second item
const item2 = (items).at(1);
item2.patchValue({
model: 'TLX',
automaker: 'Acura'
});
// change the third item
const item3 = (items).at(2);
item3.patchValue({
model: 'Accord',
automaker: 'Honda'
});