Как привязать выбранные значения флажка к массиву формы с помощью FormBuilder в Angular

У меня есть список флажков, и для управления формой я использую Angular FormBuilder. Я пытаюсь привязать выбранные значения флажка к элементу управления формой с именем itemIds в моей группе форм.

      constructor(private formBuilder: UntypedFormBuilder
        ) {
      }
    serviceTaskForm = this.formBuilder.group({
    ....
     itemIds : ['']
    })
  onCheckboxChange($event: MatLegacyCheckboxChange) {

  }

В HTML я использую

  <form>
.....
      <mat-form-field appearance = "fill">
        <div class = "demo-select-all-checkboxes" *ngFor = "let task of tasks">
          <mat-checkbox
            (change) = "onCheckboxChange($event)"
            [value] = "task.itemId">
            {{ previousTask.itemId }} {{ previousTask.invoice}} 
          </mat-checkbox>
        </div>
      </mat-form-field>
    </form>

Я хочу, чтобы элемент управления формой itemIds представлял собой массив, содержащий все выбранные значения флажка. Как я могу этого добиться?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Ваш элемент управления itemIds должен быть элементом управления формы со значением массива.

  2. Чтобы инициализировать элемент управления формы itemIds, вам следует использовать метод setValue() или patchValue и предоставить значение массива.

  3. Для работы с несколькими флажками с помощью элемента управления формой у вас должна быть следующая реализация:

    • onCheckBoxChange метод для переключения выбранного значения флажка из массива по событию (установлен/снят).
    • isChecked метод проверки itemId отмечен.
import {
  MatCheckboxModule,
  MatCheckboxChange,
} from '@angular/material/checkbox';

serviceTaskForm = this.formBuilder.group({
  itemIds: [[]],
});

ngOnInit() {
  this.itemIdFormControl.patchValue([1]);
}

onCheckboxChange($event: MatCheckboxChange, itemId: number) {
  let value: number[] = this.itemIdFormControl.value;

  if ($event.checked) value.push(itemId);
  else value.splice(value.indexOf(itemId), 1);

  this.itemIdFormControl.setValue(value, {
    emitEvent: false,
  });
}

isChecked(itemId: number) {
  return this.itemIdFormControl.value.indexOf(itemId) > -1;
}

get itemIdFormControl() {
  return this.serviceTaskForm.controls['itemIds'];
}

На ваш взгляд:

  1. Вы не можете реализовать <mat-checkbox> в элементе <mat-form-field>. Удалите элемент <mat-form-field>. Ссылка: Angular Material Ошибка при импорте mat-checkbox

  2. Реализуйте атрибут [checked] вместо атрибута [value].

<ng-container class = "demo-select-all-checkboxes" *ngFor = "let task of tasks">
  <mat-checkbox
    (change) = "onCheckboxChange($event, task.itemId)"
    [checked] = "isChecked(task.itemId)"
  >
    {{ task.itemId }} {{ task.invoice }}
  </mat-checkbox>
</ng-container>

Демо @ StackBlitz

Спасибо за ответ. Я хотел отобразить список флажков как <mat-select>, но это было невозможно. Есть идеи, как это сделать? Я добавил изображение списка в пост.

Adoulou 08.07.2024 16:08

Привет, это возможно, нужно просто настроить метку в элементах <mat-checkbox>. Что-то вроде: <mat-checkbox ...>IdItem {{ task.itemId }} - - Invoice Number {{ task.invoice }}</mat-checkbox> . Если вы хотите отображать элементы вертикально, обязательно добавьте элемент <br /> после <mat-checkbox>. Моя демо-версия примерно обновлена ​​с учетом ожидаемого вами результата.

Yong Shun 09.07.2024 02:03

Другие вопросы по теме