如何根据下拉列表中的 selected 数字生成表单输入字段 (select)
How to generate form Input field as per selected number from dropdown (select)
我想根据下拉列表中的 selected 值生成输入文本框。
<mat-label>Options</mat-label>
<mat-form-field>
<select matNativeControl name="Options" required>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</mat-form-field>
就在这个 select 框之后,一些输入字段应该按照 selected 编号。
以下解决方案适合您。
Html代码,
<div>
<mat-form-field>
<mat-label> Options</mat-label>
<mat-select
[(ngModel)]="selectedValue"
(selectionChange)="onSelectOption()"
>
<mat-option value="2">2</mat-option>
<mat-option value="3">3</mat-option>
<mat-option value="4">4</mat-option>
<mat-option value="5">5</mat-option>
</mat-select>
</mat-form-field>
<div *ngFor="let field of fieldsArray">
<input type="text" [value]="field" />
</div>
</div>
Component.ts代码,
selectedValue: number = 2;
fieldsArray: any[] = [];
onSelectOption() {
for(let i=1; i<=this.selectedValue; i++) {
this.fieldsArray.push(i);
}
}
您可以使用FormGroup
and FormArray
动态生成控件:
HTML代码:
<mat-form-field>
<mat-label>Select an option</mat-label>
<mat-select [(value)]="selected" (selectionChange)="addControlsInFormArray()">
<mat-option>None</mat-option>
<mat-option value="1">1</mat-option>
<mat-option value="2">2</mat-option>
<mat-option value="3">3</mat-option>
</mat-select>
</mat-form-field>
<form [formGroup]="fg" (ngSubmit)="onSubmit()">
<div formArrayName="inputs" *ngFor="let item of fg.get('inputs').controls; let i = index;">
<div [formGroupName]="i">
<mat-form-field class="example-full-width">
<input matInput formControlName="question" placeholder="Placeholder text" value="">
</mat-form-field>
</div>
</div>
</form>
<div style="padding-top:20px">
<h2>Form Value:</h2>
{{fg.value | json}}
</div>
TS代码:
import { Component } from "@angular/core";
import { FormBuilder, Validators,FormGroup,FormControl,FormArray} from "@angular/forms";
/** @title Simple form field */
@Component({
selector: "form-field-overview-example",
templateUrl: "form-field-overview-example.html",
styleUrls: ["form-field-overview-example.css"]
})
export class FormFieldOverviewExample {
fg: FormGroup;
fa: FormArray;
selected = 0;
constructor(private fb: FormBuilder) {
this.fg = this.fb.group({
inputs: this.fb.array([])
});
}
addControlsInFormArray() {
if (this.fa) {
while (this.fa.length !== 0) {
this.fa.removeAt(0);
}
}
for (var i = 0; i < this.selected; i++) {
this.fa = this.fg.get("inputs") as FormArray;
this.fa.push(this.createItem());
}
}
createItem(): FormGroup {
return this.fb.group({
question: new FormControl("")
});
}
}
我建议您使用响应式表单来执行此操作。看看这个 stackblitz here,但它基本上可以归结为:
组件 UI:
<select matNativeControl name="Options" required (change)="onChange($event.target.value)">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<div [formGroup]="textBoxFormGroup" *ngFor="let items of items; let i=index">
<input [formControl]="textBoxFormGroup.controls[i]" type="text" />
</div>
组件逻辑:
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 {
name = 'Angular';
items: any[] = [];
textBoxFormGroup :FormArray
constructor(public formBuilder:FormBuilder){
this.textBoxFormGroup = this.formBuilder.array([]);
this.addControl(0);
this.addControl(1);
}
ngOnInit() {
}
onChange(i) {
while(this.textBoxFormGroup.length > 0) {
this.items.pop();
this.textBoxFormGroup.removeAt(0);
}
while(i > 0) {
this.addControl(i);
i--;
}
}
addControl(i) {
this.items.push({id: i.toString()})
this.textBoxFormGroup.push(this.formBuilder.control(''));
}
}
我想根据下拉列表中的 selected 值生成输入文本框。
<mat-label>Options</mat-label>
<mat-form-field>
<select matNativeControl name="Options" required>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</mat-form-field>
就在这个 select 框之后,一些输入字段应该按照 selected 编号。
以下解决方案适合您。
Html代码,
<div>
<mat-form-field>
<mat-label> Options</mat-label>
<mat-select
[(ngModel)]="selectedValue"
(selectionChange)="onSelectOption()"
>
<mat-option value="2">2</mat-option>
<mat-option value="3">3</mat-option>
<mat-option value="4">4</mat-option>
<mat-option value="5">5</mat-option>
</mat-select>
</mat-form-field>
<div *ngFor="let field of fieldsArray">
<input type="text" [value]="field" />
</div>
</div>
Component.ts代码,
selectedValue: number = 2;
fieldsArray: any[] = [];
onSelectOption() {
for(let i=1; i<=this.selectedValue; i++) {
this.fieldsArray.push(i);
}
}
您可以使用FormGroup
and FormArray
动态生成控件:
HTML代码:
<mat-form-field>
<mat-label>Select an option</mat-label>
<mat-select [(value)]="selected" (selectionChange)="addControlsInFormArray()">
<mat-option>None</mat-option>
<mat-option value="1">1</mat-option>
<mat-option value="2">2</mat-option>
<mat-option value="3">3</mat-option>
</mat-select>
</mat-form-field>
<form [formGroup]="fg" (ngSubmit)="onSubmit()">
<div formArrayName="inputs" *ngFor="let item of fg.get('inputs').controls; let i = index;">
<div [formGroupName]="i">
<mat-form-field class="example-full-width">
<input matInput formControlName="question" placeholder="Placeholder text" value="">
</mat-form-field>
</div>
</div>
</form>
<div style="padding-top:20px">
<h2>Form Value:</h2>
{{fg.value | json}}
</div>
TS代码:
import { Component } from "@angular/core";
import { FormBuilder, Validators,FormGroup,FormControl,FormArray} from "@angular/forms";
/** @title Simple form field */
@Component({
selector: "form-field-overview-example",
templateUrl: "form-field-overview-example.html",
styleUrls: ["form-field-overview-example.css"]
})
export class FormFieldOverviewExample {
fg: FormGroup;
fa: FormArray;
selected = 0;
constructor(private fb: FormBuilder) {
this.fg = this.fb.group({
inputs: this.fb.array([])
});
}
addControlsInFormArray() {
if (this.fa) {
while (this.fa.length !== 0) {
this.fa.removeAt(0);
}
}
for (var i = 0; i < this.selected; i++) {
this.fa = this.fg.get("inputs") as FormArray;
this.fa.push(this.createItem());
}
}
createItem(): FormGroup {
return this.fb.group({
question: new FormControl("")
});
}
}
我建议您使用响应式表单来执行此操作。看看这个 stackblitz here,但它基本上可以归结为:
组件 UI:
<select matNativeControl name="Options" required (change)="onChange($event.target.value)">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<div [formGroup]="textBoxFormGroup" *ngFor="let items of items; let i=index">
<input [formControl]="textBoxFormGroup.controls[i]" type="text" />
</div>
组件逻辑:
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 {
name = 'Angular';
items: any[] = [];
textBoxFormGroup :FormArray
constructor(public formBuilder:FormBuilder){
this.textBoxFormGroup = this.formBuilder.array([]);
this.addControl(0);
this.addControl(1);
}
ngOnInit() {
}
onChange(i) {
while(this.textBoxFormGroup.length > 0) {
this.items.pop();
this.textBoxFormGroup.removeAt(0);
}
while(i > 0) {
this.addControl(i);
i--;
}
}
addControl(i) {
this.items.push({id: i.toString()})
this.textBoxFormGroup.push(this.formBuilder.control(''));
}
}