Angular - FormArray,如何重置formArray 的特定字段?
Angular - FormArray, how to reset a specific field of a formArray?
我不知道如何重置 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 的每个字段,而我想要的是只能重置特定字段,
例如所有 4 个对象的“score"
字段,同时完整保留 value 和 valueRel 字段
我试过这个:
this.fixedPointsControl.reset(["score"]);
但它所做的是像以前的表达式一样重置所有内容,所以什么都没有改变!
重置 formArray 的特定字段的正确方法是什么?
如果您的 FormArray 中有 4 个字段,您可以通过其索引重置它,因为 FormArray 中是一个 FormGroup 数组,因此您可以通过其索引访问它。
Had created a Stackblitz Demo for your reference
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: '' }));
只需创建一个 pairs
getter 即可获得 pairs
FormArray
。现在在 resetField
方法中设置一个名为 fieldName
的参数,该参数期望 pairs
FormArray
上的字段名称为 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>
这里有一个 Working Sample StackBlitz 供您参考。
我不知道如何重置 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 的每个字段,而我想要的是只能重置特定字段,
例如所有 4 个对象的“score"
字段,同时完整保留 value 和 valueRel 字段
我试过这个:
this.fixedPointsControl.reset(["score"]);
但它所做的是像以前的表达式一样重置所有内容,所以什么都没有改变!
重置 formArray 的特定字段的正确方法是什么?
如果您的 FormArray 中有 4 个字段,您可以通过其索引重置它,因为 FormArray 中是一个 FormGroup 数组,因此您可以通过其索引访问它。
Had created a Stackblitz Demo for your reference
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: '' }));
只需创建一个 pairs
getter 即可获得 pairs
FormArray
。现在在 resetField
方法中设置一个名为 fieldName
的参数,该参数期望 pairs
FormArray
上的字段名称为 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>
这里有一个 Working Sample StackBlitz 供您参考。