Обход вложенного FormArray в Angular 2

Я пытаюсь пройти через вложенный FormArray, чтобы отслеживать набор вопросов, каждый из которых имеет свой собственный FormControl. Я создал FormArray, называемый «группами» как таковой. Иерархия идет Группы [Вопросы [Ответы]]

constructor(private surveyService: SurveyService, @Inject(FormBuilder) private fb: FormBuilder) {
    this.survey = <Survey>SURVEYS[0];

    this.reactiveForm = fb.group({
      name: ['', Validators.required],
      groups: fb.array(this.getGroups())
    });

}

getGroups() : AbstractControl[] {
    return Array.apply(null,
      Array(this.survey.groups.length)).map((x, index) => new FormArray(this.getQuestions(index)))
  }

getQuestions(index) : AbstractControl[] {
    return Array.apply(null,
      Array(this.survey.groups[index].questions.length)).map(x => new FormControl(x, Validators.required));
  }

Вот мой HTML-код:

<form [formGroup] = "reactiveForm">
  <div formArrayName = "groups">
    <div *ngFor = "let group of survey.groups; index as groupIndex" [formArrayName]=groupIndex>
      <h1>{{group.groupName}}</h1>
      <div *ngFor = "let question of group.questions; index as questionIndex" [formArrayName]=questionIndex>
        <h2>{{question.question}}</h2>
        <label *ngFor = "let answer of question.responses ; index as answerIndex">
          <input type = "radio" [value]=answerIndex [formControlName]=questionIndex>{{answer}}
        </label>
      </div>
    </div>
  </div>
</form>

Я полагаю, что он работает как таковой: первый ngFor извлекает массив вопросов, второй ngFor извлекает массив ответов, а затем последний ngFor использует [formControlName], чтобы привязать каждый вопрос к одному и тому же элементу управления, давая ему уникальный отвечать. Однако я получаю следующую ошибку:

Error: Cannot find control with path: 'groups -> 0 -> 0 -> 0'

Если Groups [0] является массивом, а Groups [0] [0] также является массивом, почему [0] этого внезапно больше не существует? Как следует обходить FormArray таким образом?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
845
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для демонстрации я использовал простую структуру:

export class Group {
  title: string;
  questions: Question[] = [];

}

export class Question {
  title: string;
  answers: Answer[] = [];    
}

export class Answer {
  id: number;
  title: string;
}

Демо StackBlitz

Ответ принят как подходящий

Вот что вы создали:

Теперь посмотрим на свой шаблон:

<form [formGroup] = "reactiveForm">
  <div formArrayName = "groups">
    <div ... [formArrayName]=groupIndex>
      ...
      <div ... [formArrayName]=questionIndex>
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
             Do you see such FormArray in your FormGroup? I don't
        <...
        <label *ngFor = "let answer of question.responses ; index as answerIndex">
          <input ...[formControlName]=questionIndex>...
        </label>
      </div>
    </div>
  </div>
</form>

Как видите, Angular не может найти FormControl по пути groups -> 0 -> 0 -> 0, потому что это должен быть groups -> 0 -> 0

Так что, если вы удалите избыточную директиву [formArrayName]=questionIndex, она должна работать.

Пример ng-run

Кончик: использует <pre>{{reactiveForm.value | json}}</pre> для проверки структуры FormGroup

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