Я пытаюсь пройти через вложенный 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 таким образом?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для демонстрации я использовал простую структуру:
export class Group {
title: string;
questions: Question[] = [];
}
export class Question {
title: string;
answers: Answer[] = [];
}
export class Answer {
id: number;
title: string;
}
Вот что вы создали:
Теперь посмотрим на свой шаблон:
<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, она должна работать.
Кончик: использует <pre>{{reactiveForm.value | json}}</pre> для проверки структуры FormGroup