如何为 Angular 8 中选中的每个复选框获取下拉列表的值
How to get the value of my dropdown for each check box selected in Angular8
我正在根据从 api 获得的数据动态创建复选框和关联的下拉菜单....
我的 html 代码如下::
<label [for]="i" class="form-check-label fw7 h5 mb0" formArrayName="planDivList" *ngFor="let plan of planForm.controls.planDivList.controls; let i = index">
<br>
<input [name]="i" [id]="i" class="form-check-input" type="checkbox" [formControlName]="i">
{{planDivList[i].planCode}}
<label *ngIf="planDivList[i].divisions.length > 0" for="inputDiv">
Divisions
<select id="inputDiv" formcontrolName='divCtrl'>
<option *ngFor="let division of planDivList[i].divisions" Value="division.divisionCode">
{{division.divisionName}}
</option>
</select>
</label>
</label>
我的数据集是
planDivList = [
{ planCode: "B3692", divisions: [] },
{ planCode: "B3693", divisions: [] },
{ planCode: "B67", divisions: [{ divisionCode: "2", divisionName: "Assisted Living " }, { divisionCode: "1", divisionName: "LILC" }] },
{ planCode: "B69", divisions: [{ divisionCode: "3", divisionName: "Four Seasons" }, { divisionCode: "2", divisionName: "Lakeside" }, { divisionCode: "1", divisionName: "Sunrise" }] }
];
ts 文件:
const selectedPlans = this.planForm.value.planDivList
.map((checked, index) => (checked ? this.planDivList[index].planCode : null))
.filter(value => value !== null);
console.log(selectedPlans);
这是我的 stackblitz
https://stackblitz.com/edit/angular-fsgswa?file=src%2Fapp%2Fapp.component.ts
我能够获取选中的复选框 value.But 我如何获取在提交按钮中为该复选框选中的相应部门的值?感谢任何帮助
为了解决你的问题,我采取了几个步骤,我将在下面分解。
1。构建表单数组
您有一个数据数组,每个项目都应该有多个控件(复选框和 select)。这需要一个表单组的表单数组。
你的表单只是一个数组而已,所以我们可以简单地将表单绑定到一个数组。
稍后我们需要引用嵌套的表单控件值,因此将它们存储在属性中以便于引用。
form: FormArray;
private formControls: {
checkbox: FormControl;
division: FormControl;
}[];
// initialise component in ngOnInit instead of constructor
ngOnInit() {
this.formControls = this.plans.map((plan, i) => {
const divisionCode = plan.divisions.length > 0
? plan.divisions[0].divisionCode
: '';
return {
checkbox: this.fb.control(i === 0),
division: this.fb.control(divisionCode)
};
});
const formGroups = this.formControls.map(x => this.fb.group(x));
this.form = this.fb.array(formGroups, this.minSelectedCheckboxes(1));
}
2。将 HTML 绑定到表单
与按钮 (click)
相比,您应该更喜欢使用 (submit)
处理表单提交。 (submit)
将处理提交表单的所有方式。
HTML 绑定与我们构建的表单结构相匹配。请注意复选框和分区控件如何绑定到数组中的第 i
个表单组。
我还建议尽可能多地使用您的模型来生成循环,并限制表单绑定到表单控制指令。
<form [formGroup]="form" (submit)="onSubmit()">
<div *ngFor="let plan of plans; index as i" [formGroupName]="i">
<label>
<input type="checkbox" formControlName="checkbox">
{{plan.planCode}}
</label>
<label *ngIf="plan.divisions.length > 0" >
Divisions
<select formControlName="division">
<option *ngFor="let division of plan.divisions"
[value]="division.divisionCode">
{{division.divisionName}}
</option>
</select>
</label>
</div>
<div *ngIf="formInvalid && form.hasError('required')">
At least one plan must be selected
</div>
<button>Enroll</button>
</form>
3。处理提交
现在只是查询表单控件数组以找出哪些被选中,以及相关的 selected 部门代码是什么。
onSubmit(){
this.formInvalid = this.form.invalid;
if (this.formInvalid) {
return;
}
this.selectedPlans = this.plans
.map((plan, i) => ({
planCode: plan.planCode,
selected: this.formControls[i].checkbox.value,
divisionCode: this.formControls[i].division.value
}))
.filter(x => x.selected);
}
您需要的实际输出可能与我的示例略有不同,为了更简单的演示,我重命名了您的一些属性。希望我已经向您展示了可以应用于您自己的表单的技巧。
我正在根据从 api 获得的数据动态创建复选框和关联的下拉菜单....
我的 html 代码如下::
<label [for]="i" class="form-check-label fw7 h5 mb0" formArrayName="planDivList" *ngFor="let plan of planForm.controls.planDivList.controls; let i = index">
<br>
<input [name]="i" [id]="i" class="form-check-input" type="checkbox" [formControlName]="i">
{{planDivList[i].planCode}}
<label *ngIf="planDivList[i].divisions.length > 0" for="inputDiv">
Divisions
<select id="inputDiv" formcontrolName='divCtrl'>
<option *ngFor="let division of planDivList[i].divisions" Value="division.divisionCode">
{{division.divisionName}}
</option>
</select>
</label>
</label>
我的数据集是
planDivList = [
{ planCode: "B3692", divisions: [] },
{ planCode: "B3693", divisions: [] },
{ planCode: "B67", divisions: [{ divisionCode: "2", divisionName: "Assisted Living " }, { divisionCode: "1", divisionName: "LILC" }] },
{ planCode: "B69", divisions: [{ divisionCode: "3", divisionName: "Four Seasons" }, { divisionCode: "2", divisionName: "Lakeside" }, { divisionCode: "1", divisionName: "Sunrise" }] }
];
ts 文件:
const selectedPlans = this.planForm.value.planDivList
.map((checked, index) => (checked ? this.planDivList[index].planCode : null))
.filter(value => value !== null);
console.log(selectedPlans);
这是我的 stackblitz
https://stackblitz.com/edit/angular-fsgswa?file=src%2Fapp%2Fapp.component.ts
我能够获取选中的复选框 value.But 我如何获取在提交按钮中为该复选框选中的相应部门的值?感谢任何帮助
为了解决你的问题,我采取了几个步骤,我将在下面分解。
1。构建表单数组
您有一个数据数组,每个项目都应该有多个控件(复选框和 select)。这需要一个表单组的表单数组。
你的表单只是一个数组而已,所以我们可以简单地将表单绑定到一个数组。
稍后我们需要引用嵌套的表单控件值,因此将它们存储在属性中以便于引用。
form: FormArray;
private formControls: {
checkbox: FormControl;
division: FormControl;
}[];
// initialise component in ngOnInit instead of constructor
ngOnInit() {
this.formControls = this.plans.map((plan, i) => {
const divisionCode = plan.divisions.length > 0
? plan.divisions[0].divisionCode
: '';
return {
checkbox: this.fb.control(i === 0),
division: this.fb.control(divisionCode)
};
});
const formGroups = this.formControls.map(x => this.fb.group(x));
this.form = this.fb.array(formGroups, this.minSelectedCheckboxes(1));
}
2。将 HTML 绑定到表单
与按钮 (click)
相比,您应该更喜欢使用 (submit)
处理表单提交。 (submit)
将处理提交表单的所有方式。
HTML 绑定与我们构建的表单结构相匹配。请注意复选框和分区控件如何绑定到数组中的第 i
个表单组。
我还建议尽可能多地使用您的模型来生成循环,并限制表单绑定到表单控制指令。
<form [formGroup]="form" (submit)="onSubmit()">
<div *ngFor="let plan of plans; index as i" [formGroupName]="i">
<label>
<input type="checkbox" formControlName="checkbox">
{{plan.planCode}}
</label>
<label *ngIf="plan.divisions.length > 0" >
Divisions
<select formControlName="division">
<option *ngFor="let division of plan.divisions"
[value]="division.divisionCode">
{{division.divisionName}}
</option>
</select>
</label>
</div>
<div *ngIf="formInvalid && form.hasError('required')">
At least one plan must be selected
</div>
<button>Enroll</button>
</form>
3。处理提交
现在只是查询表单控件数组以找出哪些被选中,以及相关的 selected 部门代码是什么。
onSubmit(){
this.formInvalid = this.form.invalid;
if (this.formInvalid) {
return;
}
this.selectedPlans = this.plans
.map((plan, i) => ({
planCode: plan.planCode,
selected: this.formControls[i].checkbox.value,
divisionCode: this.formControls[i].division.value
}))
.filter(x => x.selected);
}
您需要的实际输出可能与我的示例略有不同,为了更简单的演示,我重命名了您的一些属性。希望我已经向您展示了可以应用于您自己的表单的技巧。