«классическое решение» - это создание собственного валидатора ошибок
Представьте, что у вас есть что-то вроде
options=["option 1","option 2","option 2"]
form=new FormGroup({
prop1:new FormControl(),
receivedSummons:new FormArray(this.options.map(x=>new FormControl()),this.selectAtLeastOne())
})
selectAtLeastOne()
{
return (formArray:FormArray)=>{
return formArray.value.some(x=>x)?null:{error:"At least one"}
}
}
Вам нужно только
<button [disabled]="form.invalid">submit</button>
Заполненная формапохоже на
<div [formGroup]="form">
<input formControlName="prop1">
<div formArrayName="receivedSummons">
<div *ngFor="let control of form.get('receivedSummons').controls;let i=index" >
<input type="checkbox" [formControlName]="i">{{options[i]}}
</div>
</div>
<button [disabled]="form.invalid">submit</button>
</div>
ПРИМЕЧАНИЕ. Я выбираю использовать formArray для FormControls, а не для FormArray для formGroups. Если вы хотите использовать formArray для FormGroups, код будет выглядеть как
form2=new FormGroup({
prop1:new FormControl(),
receivedSummons:new FormArray(
this.options.map(x=>new FormGroup({
isChecked:new FormControl()
})),this.selectAtLeastOne2())
})
selectAtLeastOne2()
{
return (formArray:FormArray)=>{
return formArray.value.some(x=>x.isChecked)?null:{error:"At least one"}
}
}
И .html
<div [formGroup]="form2">
<input formControlName="prop1">
<div formArrayName="receivedSummons">
<div *ngFor="let control of form.get('receivedSummons').controls;let i=index" [formGroupName]="i" >
<input type="checkbox" formControlName="isChecked">{{options[i]}}
</div>
</div>
<button [disabled]="form2.invalid">submit</button>
</div>
Вы можете увидеть две формы в stackblitz
Обновлено Я добавляю две функции для проверки / снятия галочки со всех
selectAll(select: boolean) {
this.form.get("receivedSummons").setValue(this.options.map(x => select));
}
selectAll2(select: boolean) {
this.form2.get("receivedSummons").setValue(
this.options.map(x => {
return { isChecked: select };
})
);
}
Проверка, чтобы проверить / снять все отметки (см. Как я использую переменную referencence для передачи, если проверено или нет checkBox
<input #check1 type="checkbox" (change)="selectAll(check1.checked)">Check All