我有一个具有一定数量的formArrays的reactForm。就像一个具有变体的产品一样,对于每个变体,我添加一个带有主formGroup副本的formArray。我可以添加,删除,查看但不能编辑。当页面加载时,最后一个formArray的值将替换所有其他form,就好像表单具有相同的名称会出现问题。
我将代码放在这里:
模板
<div *ngFor="let variation of variations.controls; index as i">
<div class="collapse" id="variationCollapse{{ i }}">
<div class="col-lg-12">
<default-form-box *ngFor="let box of structure.boxes"
[box]="getTabsOrCommonBox(box)"
[labels]="structure.labels"
[rules]="structure.rules"
[validations]="structure.validations"
[routes]="structure.routes"
[formats]="structure.formats"
[translations]="structure.translations"
[variation]="structure.variation"
[isVariation]="false"
[isUpdate]="true"
[data]="data.variations[i]"
[nestedFormGroup]="variationFG" <---- I guess it's here
[hidden]="!variationService.showBox(structure.variation, box, false)"
(notifyValue)="DefaultFormVariationComponent.variationInputItems($event, i)">
</default-form-box>
</div>
</div>
</div>
组件
private addVariationsForUpdate() {
if (this.data && this.isUpdateScenario()) {
if (this.data.variations.length > 0) {
this.DefaultFormVariationComponent.variationObj = this.data.variations;
this.DefaultFormVariationComponent.isUpdate = true;
this.variationService.isUpdate = true;
for (let i = 0; i < this.data.variations.length; i++) {
this.addsVariation(); <--- check here
}
}
return;
}
this.DefaultFormVariationComponent.variationObj = [];
}
组件详细信息
public addsVariation() {
this.buildVariationForm(); <---- check here
this.variations.push(this.fb.group(new Variation()));
this.variationService.index++;
console.log(this.formGroup.value.variations);
}
get variations(): FormArray {
return this.formGroup.get('variations') as FormArray;
}
private buildVariationForm() {
this.variationFG = new FormGroup({}); <--- this is it, each variation has a variationFG as formGroup
let requiredRules: Object = this.requiredRulesService.prepareRequiredRules(this.structure.rules);
this.formBuilderService.resetControlFields();
this.formBuilderService.getFieldsToControls(this.structure.boxes);
this.reactiveFields = this.formBuilderService.getControlFields();
for (let reactiveField of this.reactiveFields) {
this.formBuilderService.build(
reactiveField.controls,
this.structure.rules[ reactiveField.field ],
this.variationFG,
reactiveField.field,
this.data
);
}
this.variationFG.validator = this.requiredRulesService
.requiredValidator(
requiredRules['required_if'],
this.formBuilderService
);
}
为了让大家更好地了解问题所在,我录制了一段短片(17秒)以向您展示:
https://drive.google.com/open?id=1AQnIax7BSZEIEyqQwqDDh0L01owt9_j5
在视频中,我指出了三个变体,每个变体称为“最新变体测试” +变体的索引。在视频上,您可以清楚地注意到所有值都被最后一个索引的值替换。
希望我能得到任何帮助,如果需要更多代码,我一定会提供。
预先感谢:)
答案 0 :(得分:1)
问题
问题是您在所有变体中都使用相同的FormGroup
variationFG
。因此,无论您说什么,它最终都能反映出来。
修复
您应该为每个版本创建单独的FormGroup
。
variationFGList = [];
<div *ngFor="let variation of variations.controls; index as i">
<div class="collapse" id="variationCollapse{{ i }}">
<div class="col-lg-12">
<default-form-box *ngFor="let box of structure.boxes"
[box]="getTabsOrCommonBox(box)"
[labels]="structure.labels"
[rules]="structure.rules"
[validations]="structure.validations"
[routes]="structure.routes"
[formats]="structure.formats"
[translations]="structure.translations"
[variation]="structure.variation"
[isVariation]="false"
[isUpdate]="true"
[data]="data.variations[i]"
[nestedFormGroup]="variationFGList[index]" <- Get the FormGroup for variation
[hidden]="!variationService.showBox(structure.variation, box, false)"
(notifyValue)="DefaultFormVariationComponent.variationInputItems($event, i)">
</default-form-box>
</div>
</div>
</div>
private buildVariationForm() {
let variationFG = new FormGroup({}); //this is local variable now
let requiredRules: Object = this.requiredRulesService.prepareRequiredRules(this.structure.rules);
this.formBuilderService.resetControlFields();
this.formBuilderService.getFieldsToControls(this.structure.boxes);
this.reactiveFields = this.formBuilderService.getControlFields();
for (let reactiveField of this.reactiveFields) {
this.formBuilderService.build(
reactiveField.controls,
this.structure.rules[ reactiveField.field ],
variationFG,
reactiveField.field,
this.data
);
}
variationFG.validator = this.requiredRulesService
.requiredValidator(
requiredRules['required_if'],
this.formBuilderService
);
this.variationFGList.push(variationFG); //Add new formGroup to the Array
}
注意:该代码已在
stackoverflow
editor
中进行了修改,因此可能存在拼写错误和语法错误。请纠正自己。