Хорошо, извините, но я просто не могу понять, как это сделать ... Здесь буквально сотни постов "как мне проверить мою форму в Angular", но ни одного из них вполне соответствует тому, что я пытаюсь сделать, и я просто не могу понять, как заставить это работать. Поэтому я спрашиваю это здесь. Извините, если меня об этом спрашивали раньше.
Я использую реактивную форму в Angular 7.2.2. Я возвращаю список элементов с сервера и динамически создаю массив флажков - по одному для каждого элемента. Я хочу, чтобы пользователь мог установить один или несколько из этих флажков, но они должны установить хотя бы один из флажков, иначе форма должна быть недействительной, а кнопка отправки должна быть отключена. .
(К вашему сведению, в моей форме есть другие FormControls - либо <select>
, либо <input type="text">
- которые я не учел в этом примере. Эти элементы управления не создаются динамически, поэтому добавление валидаторов в они тривиальны.)
Вот мой компонент. html:
<form [formGroup]="myForm" (ngSubmit)="myFormSubmit()">
<div style="width: 100%; height: 160px; padding: 3px; overflow: auto;">
<label formArrayName="itemsToSelect" *ngFor="let item of myForm.controls.itemsToSelect.controls; let i = index" style="width: 85%; padding-left: 5px;">
<input type="checkbox" formControlName="{{i}}">
{{myListOfItems[i].item_id}}<br>
</label>
</div>
<input type="submit" [disable]="!this.myForm.valid">
</form>
А вот мой компонент.ts
myListOfItems: any = [];
myForm = new FormGroup({
itemsToSelect: new FormArray([])
});
ngOnInit() {
this.myService.getMyItems()
.subscribe( (eventData) => {
myListOfItems = eventData;
myListOfItems.forEach((o, i) => {
const control = new FormControl(false); //false so the checkbox defaults to not-selected
(this.myForm.controls.itemsToSelect as FormArray).push(control);
});
});
}
myFormSubmit() {
//Do stuff here that assumes at least one checkbox is checked.
}
Итак ... Как мне получить так, что myForm.valid имеет значение false, когда все флажки пусты, но true, если установлен один или несколько флажков? Любая помощь будет оценена. Спасибо.