首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于FormArray索引的角4 FormArray

基于FormArray索引的角4 FormArray
EN

Stack Overflow用户
提问于 2017-05-12 09:40:45
回答 5查看 53.7K关注 0票数 39

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

目前,当用户选择添加一个新项时,我会使用空值将其构建到formArray上。

代码语言:javascript
复制
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

代码语言:javascript
复制
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)一样

所以如果我能写出这样的东西

代码语言:javascript
复制
this.form.patchValue.atIndex(this.idx,[{ 
         item: item.name, 
         properties: { item: item.name, key: item.$key' } 
}];

但我不确定我能不能..。可以肯定的是,这种形式是不可能的。是否有任何方法专门针对在formArray中修补的项目,或者我可能没有正确地理解这一点。

我可以通过将新的值推到formArray上来解决这个问题。

代码语言:javascript
复制
this.items.push(this.buildItem(...));

不过,我得补充一下

代码语言:javascript
复制
this.items.removeAt(this.idx); 

为了删除空构建上的初始控件,这看起来不像是任何好代码。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-05-12 10:44:05

使用FormArray#at + AbstractControl#patchValue

代码语言:javascript
复制
this.items.at(index).patchValue(...);

演示

票数 50
EN

Stack Overflow用户

发布于 2017-11-15 09:55:54

如果要更新洞数组结构,只需创建一个新的FormControl就可以做到这一点:

代码语言:javascript
复制
this.form.setControl('items',  new FormControl(arrayItemsValue));

或在更新所有项目之前删除它们:

代码语言:javascript
复制
const items = (<FormArray>this.form.get('items'));
 for (let i = 0; i < items.length; i++) {
     items.removeAt(i);
 }
 this.form.get('items').setValue(arrayItemsValue);
票数 9
EN

Stack Overflow用户

发布于 2020-01-19 21:15:16

正如developer033所说:

使用FormArray#at + AbstractControl#patchValue

但是怎么做呢?下面是一个例子:

HTML中的

代码语言:javascript
复制
<div formArrayName="alternateEmail" *ngFor="let control of alternateEmail.controls; index as i">
  <input type="text" placeholder="Type an alternative email" [formControlName]="i"><input>
</div>

类中的

代码语言:javascript
复制
get alternateEmail(){  return this.registrationForm.get('alternateEmail') as FormArray }

而实际的贴片方法是:

代码语言:javascript
复制
patchDynamicFormBlockValue(){
  this.alternateEmail.at(<index>).patchValue('patchmail@gmail.com')
}

您还可以在需要时移除as FormArray并强制转换:

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43934396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档