Angular 如何正确获取checkbox选中值存入FormArray并提交后端
解决方案
你当前的代码核心问题是定义的trucksToSelect FormArray和模板中绑定的checkbox控件没有对应关系,无法直接拿到选中的id数组,按以下步骤调整即可:
1. 调整表单初始化逻辑
保留原有cargoSignupForm的结构,动态为每个truck添加对应控件存储选中状态:
// 初始化表单 this.cargoSignupForm = new FormGroup({ trucksToSelect: new FormGroup({}) }); // 拿到当前cargo对应truck列表后,动态添加子控件 const currentCargoTrucks = this.trucksByCargoId.get(cargo.id); const trucksFormGroup = this.cargoSignupForm.get('trucksToSelect') as FormGroup; // 清空旧控件(如果有切换cargo的场景) Object.keys(trucksFormGroup.controls).forEach(key => { trucksFormGroup.removeControl(key); }); // 为每个truck添加FormControl,默认未选中 currentCargoTrucks.forEach(truck => { trucksFormGroup.addControl(truck._id, new FormControl(false)); });
2. 调整模板绑定
增加formGroupName指令匹配表单结构:
<form [formGroup]="cargoSignupForm" (submit)="onSignupForCargo(cargo.id)" *ngIf="!isLoading"> <div formGroupName="trucksToSelect"> <div *ngFor="let truck of trucksByCargoId.get(cargo.id)"> <mat-checkbox [formControlName]="truck._id">{{truck.regNumber}}</mat-checkbox> </div> </div> <input type="submit" value="GO" class="button-basic"> </form>
3. 提交时生成选中id数组
提交时过滤出所有选中的truckId即可:
onSignupForCargo(cargoId: string) { const truckSelectState = this.cargoSignupForm.value.trucksToSelect; // 过滤出值为true的key,即为选中的truckId数组 const selectedTruckIds = Object.keys(truckSelectState).filter(id => truckSelectState[id]); this.cargosService.signupForCargo(cargoId, selectedTruckIds); }
注意事项
- 若页面存在切换cargo的场景,必须在切换时先清空
trucksToSelect下的旧控件,避免残留旧数据 mat-checkbox不需要额外绑定value属性,表单控件已经通过formControlName和truckId绑定
内容的提问来源于stack exchange,提问作者nbalog
相关产品推荐
相关产品推荐

