38

我希望formArray在用户在创建的空控件中添加值后更新 a 。

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()而不是在patchValue

我在角度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(...));

但是我必须添加

this.items.removeAt(this.idx); 

为了删除对空 build 的初始控制,这似乎不是任何好的代码。

4

5 回答 5

48

使用FormArray#at+ AbstractControl#patchValue

this.items.at(index).patchValue(...);

演示

于 2017-05-12T10:44:05.613 回答
9

如果要更新孔数组结构,只需创建一个新的 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);
于 2017-11-15T09:55:54.690 回答
6

正如 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在需要时删除 and cast:

(<FormArray>this.alternateEmail).at(<index>).patchValue('test@gmail.com')

于 2020-01-19T21:15:16.930 回答
2
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);
于 2021-05-20T08:58:28.830 回答
1

在 TS 文件中使用下面作为示例

let taskListArrays = this.projectParentForm.get('TaskList') as FormArray;
        
taskListArrays.controls[rowindex].patchValue({"Email":"contacttotanuj@gmail.com"};
于 2021-05-04T16:24:56.930 回答