1
我使用Angular 2 ReactiveForms创建表单。该表格由一个模板,问题&答案。模板包含很多问题,问题包含很多答案。Angular 2 - 访问嵌套Formarray(FormBuilder)
ngOnInit() {
// initialize template
this.myForm = this.formBuilder.group({
title: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(30)]],
owner: [localStorage.getItem('user')],
questions: this.formBuilder.array([
this.initQuestion()
])
});
}
initQuestion() {
// initialize question
return this.formBuilder.group({
questionText: [{value: '', disabled: true}],
answers: this.formBuilder.array([
this.initAnswer()
])
});
}
initAnswer() {
// initialize answer
return this.formBuilder.group({
answerText: [{value: '', disabled: true}]
});
}
addQuestion() {
const control = <FormArray>this.myForm.controls['questions'];
console.log(control);
control.push(this.initQuestion());
}
addAnswer() {
const control = <FormArray>this.myForm.get(['questions.0.answers']);
control.push(this.initAnswer());
}
我的目标是允许用户添加问题到模板,并回答每个问题。然而,我的问题是,我无法访问称为“答案”的嵌套数组。到目前为止,我可以添加问题并且工作正常,但是当我尝试添加问题的答案(addAnswer()方法)时,我收到一条错误消息,提示“无法读取'null'属性'push' ,它在addAnswer()方法中引用control.push。任何帮助表示赞赏!
编辑:忘了补充我的HTML代码:
<table class=pageTable align=center border="1px">
<form [formGroup]="myForm" novalidate (ngSubmit)="save(myForm)" align=center>
<!-- we will place our fields here -->
<input type="submit" [disabled]="!myForm.valid" value="Submit Template">
<!-- Template Title -->
<div class="form-group">
<label>Template Title:</label><br/>
<input type="text" formControlName="title"><br/>
<!--display error message if name is not valid-->
<small *ngIf="!myForm.controls.title.valid" class="text-danger">
Title must be between 5-30 characters.
</small>
</div>
<br/>
<!-- List of Questions -->
<div formArrayName="questions" align=center>
<div [formGroupName]="i" *ngFor="let question of myForm.controls.questions.controls; let i=index" class="Question-panel">
<div class="Question-panel-title">
<span>Question {{i + 1}}:</span>
<!-- show remove button when more than one address available -->
<span *ngIf="myForm.controls.questions.controls.length > 1"
(click)="removeQuestion(i)">
</span>
<question [group]="myForm.controls.questions.controls[i]"></question>
</div>
<!-- Llist of Answers -->
<div formArrayName="answers" align=center>
<div [formGroupName]="j" *ngFor="let answer of question.controls.answers.controls; let j=index">
<div class="Question-panel-content">
<span>Answer {{j + 1}}:</span>
<br/><a (click)="addAnswer()" style="cursor: default">
Add answer
</a>
</div>
</div>
</div>
</div>
</div>
<br/>
<a (click)="addQuestion()" style="cursor: default">
Add question
</a>
</form>
</table>
感谢您的解决方案,它将我引向正确的道路。 this.myForm.get('questions.0.answers')几乎可以按照预期工作,但是您是否可能知道添加对相应问题答案的方法?因为不管我在哪个问题上决定添加答案,只有第一个问题会得到一个新的答案,因此是“question.0.answers”。我刚刚在帖子中加入了我的HTML :) – SquishyAura
你我的好先生是救世主。谢谢你,祝你有美好的一天! – SquishyAura