Как мне реализовать динамический флажок в angular

#angular #angular6 #angular-reactive-forms #dynamic-forms

#angular #angular6 #угловые реактивные формы #динамические формы

Вопрос:

Я пытаюсь реализовать динамические формы для своего приложения angular и я следуюhttps://angular.io/guide/dynamic-form

У меня есть вопрос о флажке с более чем 4 параметрами флажка.

Моя модель вопроса с флажком на данный момент похожа на выпадающий список только с одним formControllerName («fruits_key»)

 export class CheckBoxQuestion extends QuestionBase<string> {
  controlType = "checkbox";
  options: {key: string, value: string}[] = [];

  constructor(options: {} = {}) {
    super(options);
    this.options = options["options"] || [];
 }
  

и мой объект

 new CheckBoxQuestion({
            key: "fruits_key",
            label: "Choose Fruits",
            options: [
              { key: "Apple", value: true },
              { key: "Orange", value: false },
              { key: "Grapes", value: false },
              { key: "Banana", value: false }
            ]
          })
  

Вот мой HTML для отображения элементов флажка

 <ng-container *ngSwitchCase="'checkbox'">
      <div class="d-flex">
        <div class="custom-control custom-checkbox" *ngFor="let opt of question['options']; index as idx">
          <input type="checkbox" class="custom-control-input" [formControlName]="question.key"
            [checked]="opt.value" ">
          <label class="custom-control-label">{{opt.key}}</label>
        </div>
      </div>
    </ng-container>
  

В) Проблема связана с [formControlName], для которого установлено одинаковое значение для всех элементов флажка. Как мне правильно реализовать элементы флажка, нужно ли переписывать модель флажка? Пожалуйста, сообщите, есть ли у вас лучшее решение.

Демонстрация сайта Angular:https://angular.io/generated/live-examples/dynamic-form/stackblitz.html

Ответ №1:

Я сам нашел решение.

 <ng-container *ngSwitchCase="'checkbox'">
        <div class="d-flex">
          <div *ngFor="let option of question['options']; let i=index" [formArrayName]="question.key" class="custom-control custom-checkbox">
            <input type="checkbox" [formControlName]="i" id="{{question.key  '_'  option.key}}" class="custom-control-input" (change)="getUpdate(question)"/>
            <label for="{{question.key  '_'  option.key}}" class="custom-control-label">{{option.key}}</label>
          </div>
        </div>
 </ng-container>
  

и служба управления моим вопросом, которая преобразует модель в группы форм / элементы управления формами / массивы форм.

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

toFormGroup(questions: QuestionBase<any>[]) {
let group: any = {};

questions.forEach(question => {
  if (question.controlType === "checkbox") {
    group[question.key] = this.buildCheckBoxArray(question["options"]);
  } else {
    group[question.key] = question.required
      ? new FormControl(question.value || "", Validators.required)
      : new FormControl(question.value || "");
  }
});
return new FormGroup(group);
}

buildCheckBoxArray(itemsArr): any {
 const arr = itemsArr.map(item => {
   return new FormControl(item.value);
 });
 return new FormArray(arr);
}
}