简体   繁体   English

如何在Angular中保存动态表单答案?

[英]How to save Dynamic Form Answer in Angular?

I'm trying to save some data that I display dynamic in the browser.This is my HTML where I iterate trough a list of exam questions dragged from the database and display them dynamic in browser.我正在尝试保存一些在浏览器中动态显示的数据。这是我的 HTML,我在其中遍历从数据库中拖出的考试问题列表,并在浏览器中动态显示它们。

<div mat-dialog-content [formGroup]="examform">
    <div *ngFor="let exam_question of exam_questions;let i = index">
          <mat-label >{{exam_question.questionTitle}}</mat-label><br>
          <mat-radio-group aria-label="Image Position">
         <mat-radio-button  id="{{'examItem1'+i}}" value="1" >{{exam_question.questionItem1}}</mat-radio-button>
          <mat-radio-button  id="{{'examItem2'+i}}" value="2">{{exam_question.questionItem2}}</mat-radio-button>
          <mat-radio-button id="{{'examItem3'+i}}" value="3">{{exam_question.questionItem3}}</mat-radio-button>
          <mat-radio-button  id="{{'examItem4'+i}}" value="4">{{exam_question.questionItem4}}</mat-radio-button>
        </mat-radio-group> 
      </div>
<div>
    <button class="button-course" mat-raised-button color="primary" (click)="submitAnswer()">Submit</button>
 

How can I use Form from Angular Typescript to save what the user responds to this form?如何使用 Angular Typescript 中的表单来保存用户对此表单的回复? For example what was the answer for the first question, for the second question and so on.例如,第一个问题的答案是什么,第二个问题的答案是什么等等。 I tried to put on every Form Controls and id, but I don t know how to go further.This is the form from Typescript.我试着把每个表单控件和 id,但我不知道如何进一步 go。这是来自 Typescript 的表单。

import { registerLocaleData } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { Questions } from '../models/questions';
import { SharedService } from '../service/shared.service';

@Component({
  selector: 'app-quiz-exam-page',
  templateUrl: './quiz-exam-page.component.html',
  styleUrls: ['./quiz-exam-page.component.css']
})
export class QuizExamPageComponent implements OnInit {
  examID:any;
  examform!: FormGroup;
  examData: any;
  userDetails:any;
  examFormArray=new FormArray([new FormControl('',Validators.required)]);
  constructor(private formBuilder:FormBuilder,private router:Router,private sharedService:SharedService,private route:ActivatedRoute) { }
  exam_questions:Questions[]=[];
  ngOnInit(): void {
    this.route.queryParams
      .subscribe(params => {
        this.examID = params['examID'];
      }
    );
  
    this.examform=this.formBuilder.group({
      examTitle:this.formBuilder.array([],Validators.required),
      examItem1:this.formBuilder.array([],Validators.required),
      examItem2:this.formBuilder.array([],Validators.required),
      examItem3:this.formBuilder.array([],Validators.required),
      examItem4:this.formBuilder.array([],Validators.required)
    });
    if(localStorage.getItem('token')==null)
      this.router.navigate(['login'])
    this.sharedService.getUserProfile().subscribe(res=>{
        this.userDetails=res;
        this.sharedService.getExamQuestionsByID(this.examID).subscribe(data=>{
          this.exam_questions=data;
      },err=>{
        console.log(err)
      });
       },(err:any)=>{
         console.log(err);
       },
       );
    
    
  }
  submitAnswer(submitData:any)
  {
    this.examData = submitData;
    console.log(this.examData)

  }

}

This is the generated form.是生成的表格。 And as you can see, I need the answer for every question and after that I click submit, it will save the answer for every question, but I need to know to what question it was the answer, that is why I put the Id in the HTML.正如你所看到的,我需要每个问题的答案,然后我点击提交,它会保存每个问题的答案,但我需要知道答案是什么问题,这就是为什么我把 Id 放在HTML。

This is my question array.这是我的问题数组。 It is an interface:它是一个接口:

export interface Questions {
    questionID:number;
    questionCourseID:number;
    questionTitle:string;
    questionTopic:string;
    questionPoints:string;
    questionDifficulty:string;
    questionItem1:string;
    questionItem2:string;
    questionItem3:string;
    questionItem4:string;
    qustionAnswers:string;
}

To your HTML-File I would add an NgSubmit and also add the type submit to your button.对于您的 HTML 文件,我会添加一个 NgSubmit 并将提交类型添加到您的按钮。 In the ngSubmit you give the value of your form (examForm) to the function (saveForm) in the Typescript-File.在 ngSubmit 中,您将表单 (examForm) 的值赋给 Typescript-File 中的 function (saveForm)。 Instead I would delete the (click) event on your button.相反,我会删除您按钮上的 (click) 事件。

HTML-File HTML文件

 <div mat-dialog-content [formGroup]="examform" (ngSubmit)="saveForm(examform.value)"> <div *ngFor="let exam_question of exam_questions;let i = index"> <mat-label >{{exam_question.questionTitle}}</mat-label><br> <mat-radio-group aria-label="Image Position"> <mat-radio-button id="{{'examItem1'+i}}" value="1" >{{exam_question.questionItem1}}</mat-radio-button> <mat-radio-button id="{{'examItem2'+i}}" value="2">{{exam_question.questionItem2}}</mat-radio-button> <mat-radio-button id="{{'examItem3'+i}}" value="3">{{exam_question.questionItem3}}</mat-radio-button> <mat-radio-button id="{{'examItem4'+i}}" value="4">{{exam_question.questionItem4}}</mat-radio-button> </mat-radio-group> </div> <div> <button type="submit" class="button-course" mat-raised-button color="primary">Submit</button>

If you want, that your button only is pressable if the inputs are valid (for example every required fields are filled out).如果你愿意,你的按钮只有在输入有效时才可以按下(例如,每个必填字段都已填写)。 You can add following code to your button:您可以将以下代码添加到您的按钮:

 <button [disabled]="?examForm..valid" type="submit" class="button-course" mat-raised-button color="primary">Submit</button>

In your Typescript-File, you should write a function with the same name as you specified in (ngSubmit)="functionName".在您的 Typescript 文件中,您应该编写一个 function,其名称与您在 (ngSubmit)="functionName" 中指定的名称相同。 In my example, the function Name is saveData().在我的示例中,function 名称是 saveData()。 Then you write the value from the Form to a variable with the datatype any.然后将表单中的值写入数据类型为 any 的变量。

So your TS-File would look something like:所以你的 TS-File 看起来像:

 import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms'; @Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.component.css'] }) export class TestComponent implements OnInit { examForm:; FormGroup: examData; any: constructor( private formBuilder, FormBuilder: ) { } ngOnInit(). void { this.examForm=this.formBuilder:group({ examTitle.this.formBuilder,array([].Validators,required): examItem1.this.formBuilder,array([].Validators,required): examItem2.this.formBuilder,array([].Validators,required): examItem3.this.formBuilder,array([].Validators,required): examItem4.this.formBuilder,array([].Validators;required) }): } showPreview(submitData. any) { this;examData = submitData. console.log(this.examData) } }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM