我希望在用户在空创建的控件中添加值后更新formArray
。
目前,当用户选择将我构建的新项目添加到具有空值的formArray
时。
buildItem(item?: any, key?: any): FormGroup {
// Item will pass undefined for initial buildItem in onLoad and new items
let itemName: string;
let keyValue: string;
if (item === undefined) {
itemName = ''; key = '' }
else {
itemName = item.name; keyValue = key
};
/**
* Builds a single item for form group array in the collectionForm.
*/
return this.formBuilder.group({
item: [itemName || '', Validators.required],
properties: { item, key: key } || {} });
}
这适用于初始创建和已添加项目的更新。问题在于添加了空值的新项目。当我添加一个新项目时,我需要在properties.key
在保存该新项目的方法中,我添加了patchValue
this.items.patchValue([{
// item being returned from firebase promise
item: item.name,
properties: { item: item.name, key: item.$key' }
}]);
然而patchValue
根本不起作用。当我尝试更新新值时,虽然值已保存到firebase,但仍然会返回值为空的值或者在初始BuildItem()
上设置的保存值而不是{{1中的更新值}}
我在角色patchValue
文档中看到了
它接受一个与控件结构相匹配的数组,将尽力将这些值与组中正确的控件匹配。 REF
这是否意味着它可能会也可能不会更新该值..它会尽力尝试吗?我想如果我可以添加我想修补的值的索引,那么它根本不应该是一个问题。与FormArray
所以,如果我能写出像
这样的东西removeAt(idx)
但不确定我能做到这一点......非常确定这种形式不可能。有没有办法专门针对在this.form.patchValue.atIndex(this.idx,[{
item: item.name,
properties: { item: item.name, key: item.$key' }
}];
中修补的项目,或者我可能没有正确理解这一点。
我可以通过将新值推送到formArray
formArray
然而我必须添加
this.items.push(this.buildItem(...));
为了删除空构建的初始控制,这似乎不是任何好的代码。
答案 0 :(得分:19)
使用FormArray#at
+ AbstractControl#patchValue
:
this.items.at(index).patchValue(...);
答案 1 :(得分:4)
如果要更新孔阵列结构,可以通过创建新的FormControl来完成此操作:
this.form.setControl('items', new FormControl(arrayItemsValue));
或者在更新之前删除所有项目:
const items = (<FormArray>this.form.get('items'));
for (let i = 0; i < items.length; i++) {
items.removeAt(i);
}
this.form.get('items').setValue(arrayItemsValue);
答案 2 :(得分:2)
正如developer033所说:
使用FormArray#at + AbstractControl#patchValue
但是如何?这是一个示例:
在HTML中:
<div formArrayName="alternateEmail" *ngFor="let control of alternateEmail.controls; index as i">
<input type="text" placeholder="Type an alternative email" [formControlName]="i"><input>
</div>
在课程中:
get alternateEmail(){ return this.registrationForm.get('alternateEmail') as FormArray }
以及实际的修补方法:
patchDynamicFormBlockValue(){
this.alternateEmail.at(<index>).patchValue('patchmail@gmail.com')
}
您还可以删除as FormArray
并在需要时进行投射:
(<FormArray>this.alternateEmail).at(<index>).patchValue('test@gmail.com')
答案 3 :(得分:1)
以下面的TS文件为例
let taskListArrays = this.projectParentForm.get('TaskList') as FormArray;
taskListArrays.controls[rowindex].patchValue({"Email":"contacttotanuj@gmail.com"};
答案 4 :(得分:0)
let rows = this.manageOrderForm.get('ordersForm') as FormArray;
rows.controls[this.index].patchValue({totalAmount:totalPrice});
this.index = this.index + 1;
formarray 在索引处设置值
((this.form.get('controls') as FormArray).at(index) as FormGroup).get('description').patchValue(item.description);