1

我不知道如何重置 FormArray 的单个字段,例如:

myForm = this.fb.group(
        {
            title: ["", [Validators.required, Validators.minLength(4)]],
            date: ["", Validators.required],
            pairs: this.fb.array(
                this.fPairs.map(f =>
                    this.fb.group({
                        score: [],
                        value: [],
                        valueRel: []
                    })
                )
            )
        },
        {
            validator: minMaxValidator
        }
    );

所以我的 FormArray 是一个由 4 个对象组成的数组,因为它是从以下位置映射的:

fPairs: Array<fPairs> = [
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0},
        {score: 0, value: 0, valueRel: 0}
    ];

到目前为止,为了重置我的表单的这一部分,我取得的成就是:

pairsControl= this.myForm.controls["pairs"] as FormArray;

然后使用:

this.pairsControl.reset();

但这会重置 FormArray 的每个字段,而我想要的是只能重置特定字段,

例如score"所有 4 个对象的 " 字段,同时保留完整的 value 和 valueRel 字段

我试过这个:

this.fixedPointsControl.reset(["score"]);

但它所做的是像之前的表达式一样重置所有内容,所以没有任何变化!

重置formArray的特定字段的正确方法是什么?

4

2 回答 2

2

如果您的 FormArray 中有 4 个字段,则可以通过其索引重置它,因为 FormArray 内部是 FormGroup 的数组,因此您可以通过其索引访问它。

已创建Stackblitz Demo供您参考

const pairs = this.myForm.get['pairs'] as FormArray;   // Use 'get' instead of 'controls'

// Iterates the Pairs' FormArray controls and use patchValue if you want to reset or assign a new value to a particular property
pairs.controls.forEach(pair => pair.patchValue({ score: '' }));
于 2018-12-05T07:21:24.730 回答
1

只需创建一个pairs吸气剂来获取pairs FormArray. 现在在resetField方法中设置一个名为的参数,该参数fieldName将期望在pairs FormArrayto上的文件名reset

像这样的东西:

get pairs() {
  return (<FormArray>this.myForm.get('pairs'));
}

resetField(fieldName) {
  this.pairs.controls.forEach(group => group.get(fieldName).reset());
}

然后将这些按钮添加到您的模板中:

<button (click)="resetField('score')">Reset Score</button> | 
<button (click)="resetField('value')">Reset Value</button> | 
<button (click)="resetField('valueRel')">Reset Value Rel</button>

这是您参考的工作示例 StackBlitz

于 2018-12-05T07:54:48.510 回答