【问题标题】:angular reactive form add FormArray inside a nested FormGroup inside another FormArray inside another FormGroup角度反应形式在嵌套的 FormGroup 中添加 FormArray 在另一个 FormGroup 中的另一个 FormArray 中
【发布时间】:2020-01-29 05:20:28
【问题描述】:

我创建了嵌套的 FormGroup (questionnaire),其中包含一个 FormArray (section),其中包含另一个 FormGroup (creatSection()),其中包含另一个 FormArray (question),其中我们有另一个 formgroup (creatQuestion()),我们在其中有另一个 formarray(answer) 有一个 formgroup (creatAnswer())

除非我想添加另一个问题或另一个答案,否则一切看起来都很好,addSection 工作正常 所以创建是好的,但添加中的问题。 我在想的是,当您创建一个问题时,它不知道要放在哪里,但我不知道如何解决它

我的问卷调查表是这样的

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms'
@Component({
  selector: 'app-questionnaire',
  templateUrl: './questionnaire.component.html',
  styleUrls: ['./questionnaire.component.css']
})
export class QuestionnaireComponent implements OnInit {
questionnaire:FormGroup;
section:FormArray; 
question:FormArray;
answer:FormArray;
  constructor(private fb:FormBuilder) { }

  ngOnInit() {
    this.questionnaire=this.fb.group({ 
      questionnaireName: [''],      
      section : this.fb.array([this.creatSection()])
    })
  }

creatSection():FormGroup{
return this.fb.group({
 sectionName:[''],
 question:this.fb.array([this.creatQuestion()])
}) 
}

addSection(){
 this.section=this.questionnaire.get('section') as FormArray;
  this.section.push(this.creatSection());
}

creatQuestion():FormGroup{
  return this.fb.group({
    questionName:[''],
    type:[''],
    answer:this.fb.array([this.creatAnswer()])
  })
}

addQuestion(){
  this.question=this.creatSection().get('question') as FormArray;
  this.question.push(this.creatQuestion());
}

creatAnswer():FormGroup{
  return this.fb.group({
    id:[''],
    answerName:['']
  })
}

addAnswer(){
  this.answer=this.creatQuestion().get('answer') as FormArray;
  this.answer.push(this.creatAnswer());
}

onSubmit(){
  console.log(this.questionnaire.value); 
}

}

问卷调查表.html是这样的

<h1>questionnaire bla bla</h1>
<!-- <app-section></app-section> -->
<form [formGroup]="questionnaire" (ngSubmit)="onSubmit()">
    <input type="text" placeholder="questionnaire..." formControlName="questionnaireName">
    <ng-container formArrayName="section">
    <div [formGroupName]="i" *ngFor="let ques of questionnaire.get('section').controls;let i = index;">
        
            <input placeholder="section..." formControlName="sectionName" type="text">
            <button (click)="addSection()">add section</button>
            <ng-container formArrayName="question">
            <div [formGroupName]="j" *ngFor="let sec of creatSection().get('question').controls;let j=index;">
                
                    <input placeholder="question..." formControlName="questionName" type="text">
                    <input placeholder="type..." formControlName="type" type="text">
                    <button (click)="addQuestion()">add question</button>
                    <ng-container formArrayName="answer">
                    <div [formGroupName]="k" *ngFor="let ans of creatQuestion().get('answer').controls;let k=index;">
                        
                            <input placeholder="réponse..." formControlName ="answerName" type="text">
                            <button (click)="addAnswer()">add answer</button>
                        </div>
                    </ng-container>    
                </div>
            </ng-container>
        </div>
    </ng-container>
    <button type="submit">submit</button>
</form>
{{questionnaire.value | json}}

【问题讨论】:

  • 什么不起作用?或具体!
  • 它不会添加新问题或新答案
  • 你能提供stackblitz演示吗?
  • @PrashantPimpale 这是链接link

标签: javascript angular


【解决方案1】:

首先不要在 .html 中调用 creatSection()

//WRONG
<div [formGroupName]="j" *ngFor="let sec of creatSection().get('question').controls;let j=index;">
//OK
<div [formGroupName]="j" *ngFor="let sec of ques.get('question').controls;let j=index;">

您需要将数组的“索引”作为参数传递(我称为“经典方式”),但您也可以传递数组本身的组

<button (click)="addAnswer(i,j)">add answer</button>
//or
<button (click)="addAnswer(sec)">add answer</button>

在“经典”中

addAnswer(i:number:j:number)
{
   const arraySection=((this.questionnaire.get('section') as FormArray)
   const groupQuestion=(arraySection.get('question') as FormArray).at(i)
   const arrayAnswer=groupQuestion.get('answer') as FormArray
   arrayAnswer.push(this.creatAnswer())
}

如果你传递数组本身

addAnswer(groupQuestion:FormArray)
{
   const arrayAnswer=groupQuestion.get('answer') as FormArray
   arrayAnswer.push(this.creatAnswer())
}

注意:使用 stackblitz 更容易检查,我的代码可能会出错,请理解

【讨论】:

  • 效果很好,你真的救了我@Eliseo,非常感谢你
【解决方案2】:

感谢@Eliseo,结果看起来像 问卷调查.html

<h1>questionnaire bla bla</h1>
<form [formGroup]="questionnaire" (ngSubmit)="onSubmit()">
    <input type="text" placeholder="questionnaire..." formControlName="questionnaireName">
    <ng-container formArrayName="section">
    <div [formGroupName]="i" *ngFor="let ques of questionnaire.get('section').controls;let i = index;">

            <input placeholder="section..." formControlName="sectionName" type="text">
            <button (click)="addSection()">add section</button>
            <ng-container formArrayName="question">
            <div [formGroupName]="j" *ngFor="let sec of ques.get('question').controls;let j=index;">

                    <input placeholder="question..." formControlName="questionName" type="text">
                    <input placeholder="type..." formControlName="type" type="text">
                    <button (click)="addQuestion(ques)">add question</button>
                    <ng-container formArrayName="answer">
                    <div [formGroupName]="k" *ngFor="let ans of sec.get('answer').controls;let k=index;">

                            <input placeholder="réponse..." formControlName ="answerName" type="text">
                            <button (click)="addAnswer(sec)">add answer</button>
                        </div>
                    </ng-container>    
                </div>
            </ng-container>
        </div>
    </ng-container>
    <button type="submit">submit</button>
</form>
{{questionnaire.value | json}}

问卷调查表看起来像这样

import { Component,OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms'
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit  {
  questionnaire:FormGroup;
  section:FormArray;
  question:FormArray;
  answer:FormArray;
  constructor(private fb:FormBuilder) { }
  ngOnInit() {
 this.questionnaire=this.fb.group({ 
      questionnaireName: [''],      
      section : this.fb.array([this.creatSection()])
    })
  }
  creatSection():FormGroup{
return this.fb.group({
 sectionName:[''],
 question:this.fb.array([this.creatQuestion()])
}) 
}

addSection(){
 this.section=this.questionnaire.get('section') as FormArray;
  this.section.push(this.creatSection());
}

creatQuestion():FormGroup{
  return this.fb.group({
    questionName:[''],
    type:[''],
    answer:this.fb.array([this.creatAnswer()])
  })
}

addQuestion(groupSection:FormArray){
  const arrayQuestion=groupSection.get('question') as FormArray
  arrayQuestion.push(this.creatQuestion())
}

creatAnswer():FormGroup{
  return this.fb.group({
    id:[''],
    answerName:['']
  })
}

addAnswer(groupQuestion:FormArray){
    const arrayAnswer=groupQuestion.get('answer') as FormArray
  arrayAnswer.push(this.creatAnswer())
}

onSubmit(){
  console.log(this.questionnaire.value); 
}
}

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2021-07-07
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2017-11-09
    • 2021-09-16
    • 2020-07-20
    • 2019-08-03
    相关资源
    最近更新 更多