【问题标题】:How to get the value of my dropdown for each check box selected in Angular8如何为Angular 8中选择的每个复选框获取我的下拉列表的值
【发布时间】:2020-03-10 22:57:57
【问题描述】:

我正在从我从 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);

这是我的堆栈闪电战

https://stackblitz.com/edit/angular-fsgswa?file=src%2Fapp%2Fapp.component.ts

我能够获得选定的复选框值。但是我如何获得在提交按钮中为该复选框选择的相应部门的值?任何帮助表示赞赏

【问题讨论】:

    标签: angular angular7 angular8


    【解决方案1】:

    为了解决您的问题,我采取了几个步骤,我将在下面分解。

    1。构建表单数组

    您有一个数据数组,每个项目都应该有多个控件(复选框和选择)。这需要表单组的表单数组。

    您的表单是一个数组,仅此而已,因此我们可以简单地将表单绑定到一个数组。

    稍后我们需要引用嵌套的表单控件值,因此将它们存储在一个属性中以便于引用。

    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 绑定到表单

    您应该更喜欢使用(submit) 处理表单提交,而不是使用按钮(click)(submit) 将处理可以提交表单的所有方式。

    HTML 绑定与我们构建的表单的结构相匹配。请注意复选框和除法控件如何绑定到数组中的ith 表单组。

    我还建议尽可能使用您的模型来生成循环,并将表单绑定限制为表单控制指令。

    <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。处理提交

    现在只是查询表单控件数组以找出检查了哪些,以及选定的分区代码与哪些相关的情况。

    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);
    }
    

    您需要的实际输出可能与我的示例略有不同,为了更简单的演示,我重命名了您的一些属性。希望我已经展示了您可以应用于自己的表单的技术。

    演示:https://stackblitz.com/edit/angular-qxm8wk

    【讨论】:

    • 非常感谢您花时间详细解释。你拯救了我的一天。我对 Angular 和学习真的很陌生。还有一个问题.. 如果我有其他相同形式的字段,比如名字、出生日期等?如何将验证添加到表单数组中的这些字段,如必填字段?以及如何在提交时获取他们的值???再次非常感谢。
    • 没问题。添加其他控件很简单。您将需要返回使用表单组作为您的顶级元素。然后根据需要添加其他控件/数组。我已经分叉了我的演示:stackblitz.com/edit/angular-tbtmaf
    • 再次,只是演示概念 - 您至少需要整理一下您认为合适的 HTML
    • 实际上在你添加了名字验证之后..计划错误没有触发“必须选择至少一个计划”..知道为什么吗?
    • 啊,是的,我破坏了 HTML 中的验证查询。我已经修复了它,虽然我不喜欢把它留在我自己的项目中——我宁愿让我的所有表单查询都是强类型的,但希望你了解它是如何工作的并提出来用你自己的策略
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2022-11-24
    • 2023-03-09
    相关资源
    最近更新 更多