Angular Reactive Forms:动态生成单选按钮
Angular Reactive Forms: Dynamically generating radio buttons
预期行为:
从 json 文件生成一组多项选择题。每个问题都应包含无线电输入形式的多个选项。您一次只能select一个选项。
预期行为 -
实际行为:
一切看起来都是正确的,直到您单击单选按钮然后单击另一个按钮并且它不会删除 select 前一个按钮。如果您一直单击并且无法删除select任何一个选项,您最终可能会 selecting 每个选项。
实际行为 -
代码分解:
它的基础是 Review 组件,我们在其中循环遍历一系列问题并为每个问题生成一个问题组件。我们还构建了 FormGroup 并将其传递。每个问题组件以完全相同的方式生成多个选项组件。每个选项组件都包含一个 <input type="radio">
和一个 <label>
stackblitz.com/edit/angular-dynamically-generated-radio-buttons
观察:
在 Option 组件的 html 中,如果我从 <input>
中删除 [formControlName]="name"
,那么它会纠正我遇到的问题,但这是 Reactive Forms 不可或缺的一部分。我一定是在这里做错了什么,但对于我来说,我无法弄清楚。它的行为就像每个选项都有自己的表单控件,或者至少是我想象的那样。
您可以在下面看到表单组的日志,以及问题 1 的 html:选项 1 和 2。据我所知,这是应该的。请帮忙!
FormGroup 日志 -
问题 1 的 html,选项 1&2 -
<div class="form-check" [formGroup]="form">
<input class="form-check-input" type="radio" [id]="id" [value]="option.letter" [name]="name" #op [formControlName]="name" >
<label class="form-check-label" [for]="id" >
{{option.text}}
</label>
</div>
import { Component, OnInit, Input, ViewChild, ElementRef, AfterViewInit, Renderer2 } from '@angular/core';
import { Question } from '../../models/question';
import { Option } from '../../models/option';
import { FormGroup } from '@angular/forms';
@Component({
selector: 'app-option',
templateUrl: './option.component.html',
styleUrls: ['./option.component.scss']
})
export class OptionComponent implements OnInit, AfterViewInit {
@Input() question: Question;
@Input() option: Option;
@Input() form: FormGroup;
@ViewChild('op') op: ElementRef;
id:string;
name:string;
constructor(
private renderer: Renderer2
) { }
ngOnInit() {
this.id = `${this.question.number}${this.option.letter}`;
this.name = `${this.question.number}`;
}
ngAfterViewInit() {
this.renderer.setProperty(this.op.nativeElement, 'name', this.name);
}
}
代码共享应该可以解决您的问题。
发生这种情况是因为出于某种原因 angular 没有在单选按钮上写入名称属性。
所以这段代码是明确写的。
Rahul 的补丁效果很好,但我最终所做的只是切换到使用 angular-material 元素。事后看来,在使用 Angular 时使用 Angular Material 元素可能是个好主意。但对于那些出于某种原因无法解决问题的人,他的解决方案有效。
下面是我的代码 angular material 的样子:
选项组件html
<div>
<mat-radio-button [value]="option.letter" >
{{option.text}}
</mat-radio-button>
</div>
问题组件html
<div [formGroup]="form">
<mat-radio-group [formControlName]="name">
<label>{{question.label}}</label>
<ng-template #options_anchor></ng-template>
</mat-radio-group>
</div>
预期行为: 从 json 文件生成一组多项选择题。每个问题都应包含无线电输入形式的多个选项。您一次只能select一个选项。
预期行为 -
实际行为: 一切看起来都是正确的,直到您单击单选按钮然后单击另一个按钮并且它不会删除 select 前一个按钮。如果您一直单击并且无法删除select任何一个选项,您最终可能会 selecting 每个选项。
实际行为 -
代码分解:
它的基础是 Review 组件,我们在其中循环遍历一系列问题并为每个问题生成一个问题组件。我们还构建了 FormGroup 并将其传递。每个问题组件以完全相同的方式生成多个选项组件。每个选项组件都包含一个 <input type="radio">
和一个 <label>
stackblitz.com/edit/angular-dynamically-generated-radio-buttons
观察:
在 Option 组件的 html 中,如果我从 <input>
中删除 [formControlName]="name"
,那么它会纠正我遇到的问题,但这是 Reactive Forms 不可或缺的一部分。我一定是在这里做错了什么,但对于我来说,我无法弄清楚。它的行为就像每个选项都有自己的表单控件,或者至少是我想象的那样。
您可以在下面看到表单组的日志,以及问题 1 的 html:选项 1 和 2。据我所知,这是应该的。请帮忙!
FormGroup 日志 -
html,选项 1&2 -
<div class="form-check" [formGroup]="form">
<input class="form-check-input" type="radio" [id]="id" [value]="option.letter" [name]="name" #op [formControlName]="name" >
<label class="form-check-label" [for]="id" >
{{option.text}}
</label>
</div>
import { Component, OnInit, Input, ViewChild, ElementRef, AfterViewInit, Renderer2 } from '@angular/core';
import { Question } from '../../models/question';
import { Option } from '../../models/option';
import { FormGroup } from '@angular/forms';
@Component({
selector: 'app-option',
templateUrl: './option.component.html',
styleUrls: ['./option.component.scss']
})
export class OptionComponent implements OnInit, AfterViewInit {
@Input() question: Question;
@Input() option: Option;
@Input() form: FormGroup;
@ViewChild('op') op: ElementRef;
id:string;
name:string;
constructor(
private renderer: Renderer2
) { }
ngOnInit() {
this.id = `${this.question.number}${this.option.letter}`;
this.name = `${this.question.number}`;
}
ngAfterViewInit() {
this.renderer.setProperty(this.op.nativeElement, 'name', this.name);
}
}
代码共享应该可以解决您的问题。
发生这种情况是因为出于某种原因 angular 没有在单选按钮上写入名称属性。
所以这段代码是明确写的。
Rahul 的补丁效果很好,但我最终所做的只是切换到使用 angular-material 元素。事后看来,在使用 Angular 时使用 Angular Material 元素可能是个好主意。但对于那些出于某种原因无法解决问题的人,他的解决方案有效。
下面是我的代码 angular material 的样子:
选项组件html
<div>
<mat-radio-button [value]="option.letter" >
{{option.text}}
</mat-radio-button>
</div>
问题组件html
<div [formGroup]="form">
<mat-radio-group [formControlName]="name">
<label>{{question.label}}</label>
<ng-template #options_anchor></ng-template>
</mat-radio-group>
</div>