Чтобы решить вашу проблему, я предпринял несколько шагов, о которых я расскажу ниже.
1. Создайте массив форм
У вас есть массив данных, для которого у каждого элемента должно быть несколько элементов управления (установите флажок и выберите). Для этого требуется массив форм из групп форм.
Ваша форма - это массив и ничего более, поэтому мы можем просто связать форму с массивом.
Нам нужно будет обратиться к вложенной форме управляйте значениями позже, поэтому сохраните их в свойстве для удобства.
form: FormArray;
private formControls: {
checkbox: FormControl;
division: FormControl;
}[];
// initialise component in ngOnInit instead of constructor
ngOnInit() {
this.formControls = this.plans.map((plan, i) => {
const divisionCode = plan.divisions.length > 0
? plan.divisions[0].divisionCode
: '';
return {
checkbox: this.fb.control(i === 0),
division: this.fb.control(divisionCode)
};
});
const formGroups = this.formControls.map(x => this.fb.group(x));
this.form = this.fb.array(formGroups, this.minSelectedCheckboxes(1));
}
2. Привязать HTML к форме
Вы должны предпочесть обработку отправки формы с помощью (submit)
для кнопки (click)
. (submit)
будет обрабатывать все способы отправки формы.
Привязки HTML соответствуют структуре формы, которую мы создали. Обратите внимание, как флажки и элементы управления делением привязываются к i
-й группе форм в массиве.
Я бы также рекомендовал максимально использовать вашу модель для создания циклов и ограничить привязку формы к элементу управления формы. директивы.
<form [formGroup]="form" (submit)="onSubmit()">
<div *ngFor="let plan of plans; index as i" [formGroupName]="i">
<label>
<input type="checkbox" formControlName="checkbox">
{{plan.planCode}}
</label>
<label *ngIf="plan.divisions.length > 0" >
Divisions
<select formControlName="division">
<option *ngFor="let division of plan.divisions"
[value]="division.divisionCode">
{{division.divisionName}}
</option>
</select>
</label>
</div>
<div *ngIf="formInvalid && form.hasError('required')">
At least one plan must be selected
</div>
<button>Enroll</button>
</form>
3. Обработка отправки
Теперь это просто случай запроса массива управления формой, чтобы выяснить, какие из них проверены, и какой выбранный код деления имеет отношение к делу.
onSubmit(){
this.formInvalid = this.form.invalid;
if (this.formInvalid) {
return;
}
this.selectedPlans = this.plans
.map((plan, i) => ({
planCode: plan.planCode,
selected: this.formControls[i].checkbox.value,
divisionCode: this.formControls[i].division.value
}))
.filter(x => x.selected);
}
Фактический нужный вам вывод, вероятно, будет немного отличаться от моего примера, и я переименовал некоторые из ваших свойств в целях упрощения демонстрации. Надеюсь, я продемонстрировал методы, которые вы можете применить к своей форме.
DEMO: https://stackblitz.com/edit/angular-qxm8wk