javascript - Angular 表单验证,在 HTML 上迭代时访问表单控件

标签 javascript angular typescript validation angular-reactive-forms

我有一个问题列表,答案选项作为单选按钮字段。我从 JSON 文件中得到这些问题和答案。所以我在 HTML 上迭代它并动态地为 formControlName 分配值。我的问题是如何在迭代控制值时进行验证?

*ngIf="cricketForm.control.get('ques{{i}}').invalid" 

*ngIf="cricketForm.control.get('ques{{i}}').invalid" 

这给了我一个错误。如何以正确的方式做到这一点?

https://stackblitz.com/edit/angular-yq4lyz-zt9b3h?file=app/form-field-overview-example.html 现在验证工作不正常

html文件:

<form [formGroup]="cricketForm">
  <div *ngFor = "let user of userJson; let i =index ">
    <div class="label1" for="NameId">{{user.question}}</div>
    <mat-radio-group formControlName="ques{{i+1}}" aria-label="Select an option">
      <div *ngFor = "let option of user.options; let j =index">
        <mat-radio-button  [value]=j>{{option}}</mat-radio-button>
      </div>
    </mat-radio-group>


  <div class="invalid-feedback" *ngIf="cricketForm.control.get('ques{{i}}').invalid" >This field is required</div>
  </div>
    <button (click)="onSubmit()">Submit</button>
    <button (click)="onReset()">Reset</button>
</form>

ts 文件:

ngOnInit() {
    this.cricketForm = this.formBuilder.group({
      ques1: [null, [Validators.required]],
      ques2: [null, [Validators.required]],
      ques3: [null, [Validators.required]],
      ques4: [null, [Validators.required]]
    })
    this.userDataService.getJSON().subscribe(data => {
      console.log(data);
      this.userJson = data;
      this.options = data.options
    });
}

示例 JSON 数据:

[
{"question": "Who Was The First Indian To Hit A Test Century?", "options":["Lala Amarnath","Kapil Dev", "Sunil Gavaskar"],"ans":"Lala Amarnath"},
{"question":"Who Won The Inaugural Asia Cup Championship?","options":["Pakistan","Sri Lanka", "India"],"ans":"India"},
{"question":"Who Was Australia’s First Captain?","options":["F.S.Jackson"
,"D.W. Gregory", "Tony Lewis"],"ans":"D.W. Gregory"},
{"question":" When And Where Was The First Ranji Trophy Match Played?","options":["kolkata"
,"Mumbai", "Chennai"],"ans":"Chennai"}
]

最佳答案

你有一个语法错误。必须是

*ngIf="cricketForm.get('ques'+(i+1)).invalid"

查看您的 forked stackblitz

注意:我认为您必须尝试使用​​ FormArrays 重新考虑您的代码。方法就这么简单

<form formGroup="formArray">
  <div *ngFor = "let control of formArray.controls; let i =index ">
    <div class="label1" for="NameId">{{userJson[i].question}}</div>
    <mat-radio-group [formControl]="control" aria-label="Select an option">
      <div *ngFor = "let option of userJson[i].options; let j =index">
        <mat-radio-button  [value]=j>{{option}}</mat-radio-button>
      </div>
    </mat-radio-group>
  <div class="invalid-feedback" *ngIf="control.invalid" >This field is required</div>
  </div>
    <button (click)="onSubmit()">Submit</button>
    <button (click)="onReset()">Reset</button>

</form>

看到了,我们遍历 formArray.controls 并使用 i=index。要显示标签,请使用 userJson[i]

哪里:

this.formArray=new FormArray(
    this.userJson.map(
      ()=>new FormControl(null,Validators.required))
);

关于javascript - Angular 表单验证,在 HTML 上迭代时访问表单控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56404186/

相关文章:

javascript - 在 JQuery 中使用面板的最后一个元素的名称查找其值

javascript - 当商店未加载结果时,Extjs 组合框不断重置文本值

javascript - 绕过同源策略以从跨域 iframe 中获取页面的顶级 URL

javascript - Angular 无法访问返回的数据

javascript - 使用 Angular http 从 firebase 实时数据库获取数据

meteor - 提供 '--isolatedModules' 标志时无法编译 namespace

angular - Angular 4 中的 Websocket 和 RxJS 混淆

angular - 如何在 Angular 4 中向 CSS/JS 文件添加版本号?

typescript - tsx 文件中的通用类型解析

angular - 模型驱动/ react 形式 : Auto mapping from Model to FormGroup ?