Как мы устанавливаем динамические флажки на checked на основе значения из базы данных в угловых реактивных формах?

#angular #checkbox #angular-reactive-forms #reactive-forms

#angular #флажок #angular-reactive-forms

Вопрос:

Я новичок в реактивных формах и изо всех сил пытаюсь динамически устанавливать значение флажков в true. Вот пример: я получаю предварительно выбранные значения фруктов для конкретного пользователя из базы данных, и эти фрукты необходимо проверять, когда пользователь загружает страницу.

Я использую приведенный ниже HTML-код:

 <ng-container>
<div class="form-check form-check-inline" style="display: block;" *ngFor="let control of fruitsArray.controls; let i = index;">
  <input *ngIf="i<11" class="form-check-input" [formControl]="control" type="checkbox" id="inlineCheckbox{{i}}" [checked]="fruitsCheck[i].checked">
  <label *ngIf="i<11" class="form-check-label" for="inlineCheckbox{{i}}">{{fruitsCheck[i].label}} <br /></label>
</div>
  

fruitsCheck — это массив объектов, который содержит метку и проверяемое значение, как показано ниже:

 fruitsCheck : Array<{label: string, checked: boolean}> = [];
  

fruitsCheck будет содержать такие значения, как:

 0: {label: "Apple", checked: true},
1: {label: "Orange", checked: false},
2: {label: "Pineapple", checked: true},
3: {label: "Kiwi", checked: false}
  

Используя приведенный выше код, я могу просто установить соответствующие флажки как отмеченные, но, однако, после проверки значения конкретного элемента управления checkbox оно по-прежнему отображается как false.Я бы хотел, чтобы флажок не только был установлен, но и для значения элемента управления было установлено значение true.

Я читал о patchValue, но не уверен, как его использовать, чтобы установить значение для динамических флажков. Заранее спасибо за любую помощь!

Ответ №1:

Вот рабочий пример заполнения списка флажков в реактивной форме.

 import { Component, OnInit } from "@angular/core";
import { FormArray, FormBuilder, FormGroup } from "@angular/forms";
import { take } from "rxjs/operators";
import { DataService } from "./data.service";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
  public fruitsForm: FormGroup;

  get fruitsArray() : FormArray {
    return this.fruitsForm.get('fruits') as FormArray
  } 

  constructor(private dataService: DataService, private fb: FormBuilder) {}

  ngOnInit(): void {
    this.dataService
      .getFruits()
      .pipe(take(1))
      .subscribe(fruits => {
        this.fruitsForm = this.fb.group({
          name: "Joe Bloggs",
          fruits: this.fb.array(fruits.map(f => this.fb.group(f)))
        });
      });
  }
}
  

HTML

 <ng-container *ngIf="fruitsForm">
    <form [formGroup]="fruitsForm">
        <input name="name" formControlName="name" />
        <div formArrayName="fruits">
            <div *ngFor="let fruit of fruitsArray.controls; let i = index" [formGroupName]="i">
                <input type="checkbox" formControlName="selected" />
                <label>{{fruit.value.name}}</label>
            </div>
        </div>
    </form>
    <br />
    <div>{{fruitsForm.value | json}}</div>
</ng-container>
  

Мы смоделировали выборку из базы данных с помощью сервиса и оператора RxJS delay .

 import { Injectable } from "@angular/core";
import { Observable, of } from "rxjs";
import { delay } from "rxjs/operators";

interface Fruit {
  id: number;
  name: string;
  selected: boolean;
}

@Injectable()
export class DataService {
  constructor() {}

  public getFruits(): Observable<Fruit[]> {
    return of([
      {
        id: 1,
        name: "Apple",
        selected: true
      },
      {
        id: 2,
        name: "Pear",
        selected: false
      },
      {
        id: 3,
        name: "Orange",
        selected: false
      }
    ]).pipe(delay(250));
  }
}
  

Мы используем сервис FormBuilder для создания нашей формы.

Мы объединяем наши элементы управления в вызываемую fruitsForm FormGroup .

В нашем FormGroup случае fruits это FormArray, допускающий множество входных данных.

Каждый Fruit объект сопоставляется с новым FormGroup , и каждое свойство в нашем Fruit объекте будет преобразовано в FormControl .

Средство fruitsArray получения должно упростить доступ к нашему свойству формы.

Чтобы подключить наш шаблон к FormArray , мы используем formArrayName директиву.

formGroupName Директива использует индекс find the correct FormGroup в нашем fruits FormGroup . Чтобы подключить наш флажок к элементу selected управления, мы используем formControlName директиву.