Coderaizer, вам нужно знать, что вы хотите получить.Видя ваш код, я думаю, вы хотите получить что-то вроде
{answer:...,answerExt:...}
Что ж, в вашем коде есть некоторые ошибки.(некоторые из них являются концептуальными ошибками)
Ваш ngOnInit в компоненте form-main должен учитывать, когда данные имеют ключ и если этот ключ не повторяется.В качестве supouse вы хотите получить вышеуказанные данные
ngOnInit() {
const formContent: any = {};
this.dataList.forEach(data => {
//we check if the formContent has or not the property data.key
if (data.key && !formContent[data.key])
{
formContent[data.key] = new FormControl(data.value);
}
//we check if the formContent has or not the property data.key+"Ext"
if (data.extendedFields && !formContent[data.key+'Ext'])
formContent[data.key+'Ext'] = new FormControl(data.extendedFields.value);
});
this.quizForm = new FormGroup(formContent);
}
Поскольку у нас может быть два элемента управления (answer и answerExt), в вашем компоненте form-control, в ngOnInit
ngOnInit() {
this.control = this.parentForm.get(this.data.key);
this.controlExt = this.parentForm.get(this.data.key+"Ext");
}
затем, ваш form-control-component.html может быть похож на
<h3>{{data.title}}</h3>
<label *ngIf="data.controlType == 'text'" [attr.for]="data.key">{{data.label}}</label>
<input *ngIf="data.controlType == 'text'" [type]="data.type">
<div *ngIf="data.controlType == 'radio'">
<ng-container *ngFor="let opt of data.options">
<label>
<!--see that we use formControl-->
<input style="margin-left: 5px;" [formControl]="control" type="radio"
<!--I use "data.id"-->
[name]="data.key" [value]="data.id"
[id]="data.quizId"> {{opt.key}}
</label>
</ng-container>
</div>
<!--the "if" is simple data.id=control.value-->
<div *ngIf="data.extendedFields && data.id==control.value">
<ng-container>
<label [attr.for]="data.key">{{data.extendedFields.text}}</label>
<!--see that we use formControl-->
<input *ngIf="data?.extendedFields.type == 'text'" [formControl]="controlExt">
</ng-container>
</div>
Вы можете увидеть работу в stackblitz
ПРИМЕЧАНИЕ. Там много ненужного кода,и «карта» списка данных не понятна, попробуйте просто это.Поэтому, если вы выберете опцию, которая не имеет расширенных полей, вы получите значение