单选按钮组之间的 Tab 键以角度形式中断

And*_*rra 5 angular angular-forms

我有两个单选按钮组,我向其中添加了角度形式控件。我遇到的问题是,当我添加控件时,单选按钮分组消失了。此外,当我检查单选按钮时,它的name属性也消失了。结果是我无法再在不同的单选按钮组之间正确切换。我怎样才能解决这个问题?

示例: https: //stackblitz.com/edit/angular-qdqnmo

TS:

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
  formData = {
          "questions": [
            {
              "refCode": "Question1",
              "answers": [
                {
                  "refCode": "Question1Answer1",
                  "selected": true
                },
                {
                  "refCode": "Question1Answer2",
                  "selected": false
                }
              ]
            },
            {
              "refCode": "Question2",
              "answers": [
                {
                  "refCode": "Question2Answer1",
                  "selected": false
                },
                {
                  "refCode": "Question2Answer2",
                  "selected": false
                },
                {
                  "refCode": "Question3Answer3",
                  "selected": true
                }
              ]
            }
          ]
        };

  formGroup: FormGroup;

  ngOnInit() {
    const group = {};

    this.formData.questions.forEach(question => {
      group[question.refCode] = new FormControl();
    });

    this.formGroup = new FormGroup(group);
  }
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<h2>Normal Buttons:</h2>
<div *ngFor="let question of formData.questions; index as i;">
  <h3>Group {{i + 1}}:</h3>
  <div>
    <div *ngFor="let answer of question.answers" >
      <input type="radio" id="answer.refCode" [checked]="answer.selected" 
      [name]="question.refCode" [value]="answer.refCode" >
      <label for="answer.refCode">{{answer.refCode}}</label>  
    </div>
  </div>
  --------------------------------------------------------------------
</div>

<h2>Angular Buttons:</h2>
<div *ngFor="let question of formData.questions; index as i;">
  <h3>Group {{i + 1}}:</h3>
  <div [formGroup]="formGroup">
    <div *ngFor="let answer of question.answers" >
      <input type="radio" id="answer.refCode" [checked]="answer.selected" 
      [name]="question.refCode" [value]="answer.refCode" 
      [formControlName]="question.refCode">
      <label for="answer.refCode">{{answer.refCode}}</label>  
    </div>
  </div>
  --------------------------------------------------------------------
</div>
Run Code Online (Sandbox Code Playgroud)

模块:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';

import { AppComponent } from './app.component';

@NgModule({
  imports:      [ BrowserModule, FormsModule, ReactiveFormsModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

AJT*_*T82 3

题外话:有趣的问题,以前没有注意到这一点!

使用属性绑定而不是属性绑定似乎可以解决这个问题!这样您就可以获得name字段中的实际属性,就像“普通”按钮一样。

但是......您还有另一个即将出现的问题,所以让我们也解决这个问题,无论如何您最终都会遇到这个问题。

但首先,使用属性绑定:

使用:

[attr.name]="question.refCode"
Run Code Online (Sandbox Code Playgroud)

代替:

[name]="question.refCode"
Run Code Online (Sandbox Code Playgroud)

然后谈谈你的另一个问题。当然,在模板中使用时[checked],它看起来已检查,但实际上,直到您与单选按钮交互时才会设置表单值。因此,删除[checked]并将值设置为表单控件。这意味着您正在寻找selected属性为true(如果存在)的答案,但您想将其用作refCode值。那么我建议如下:

this.formData.questions.forEach(question => {
  const preselected = question.answers.find(x => x.selected === true)
  group[question.refCode] = new FormControl((preselected && preselected.refCode) || null);
});
Run Code Online (Sandbox Code Playgroud)

你的分叉STACKBLITZ