【问题标题】:Dynamic material checkboxes动态材质复选框
【发布时间】:2018-04-04 01:28:40
【问题描述】:

我有一系列具有以下结构的服务:

  • addonOptions[]
  • hasAddons
  • serviceId

addonOptions[] 具有以下结构的对象

  • serviceId
  • addonName
  • addonId
  • isChecked

我遍历服务并生成serviceIds 匹配的动态复选框。现在我想默认选中复选框,以防isChecked 为真。但以下方法不起作用:

<ng-container *ngFor="let service of serviceOptions; let i = index">
    <label *ngIf="service.hasAddons"><b>AddOns</b></label>
    <p *ngFor="let addon of service.addonOptions">
        <ng-container *ngIf="service.serviceId == addon.serviceId">
            <md-checkbox
                formControlName="addonName"
                type="checkbox"
                [ngModel]="addon.isChecked"
                [checked]="true"
                (change)="selectServiceAddon($event.checked,addon)">
                    {{ addon.addonName }}
                </md-checkbox>
        </ng-container>
    </p>
</ng-container>

【问题讨论】:

  • 这是一种反应形式吗?如果是这样,您的第一个问题是您无法使用一个表单控件捕获多个值。
  • 是的,它是反应形式,问题是一样的!!在这种情况下你能提供一些帮助吗?
  • 答案如何,一些答案是否解决了您的问题? :)

标签: angular angular-reactive-forms


【解决方案1】:

您不能使用单个表单控件捕获单个值,您需要的是一个 formArray,我们将选中的项目推送到其中。这是一个简化的示例,您正在迭代的数据如下所示:

addonOptions = [{addonName:"name1", isChecked: false},
                {addonName:"name2", isChecked: true},
                {...}]

当我们构建表单时,我们只声明一个空的表单数组:

this.myForm = this.fb.group({
  addons: this.fb.array([])
});

那么如果在我们提交表单之前我们真的不需要关心值,我们可以在提交表单之后给表单设置值。

所以在模板中我们只是像这样迭代你拥有的数组:

<div *ngFor="let addon of addonOptions">
  <input type="checkbox" [(ngModel)]="addon.isChecked" [ngModelOptions]="{standalone: true}"> 
     {{addon.addonName}}
</div>

并且不要添加任何表单控件。

在提交时,我们过滤 isChecked 为 true 的值,并将过滤后的数组应用为 formArray,如下所示:

onSubmit() {
  let formArr = this.addonOptions.filter(x => x.isChecked === true)
  this.myForm.setControl('addons', this.fb.array([...formArr]));
}

DEMO

如果需要,您还可以在选中/取消选中时动态添加/删除字段,然后对此进行一些衍生:https://stackoverflow.com/a/43424244/6294072

【讨论】:

    【解决方案2】:

    你可以尝试使用:

    <md-checkbox 
      formControlName="addonName" 
      type="checkbox" 
      [checked]="addon && addon.isChecked" 
      (change)="selectServiceAddon($event.checked,addon)">
      {{addon.addonName}}
    </md-checkbox>
    

    【讨论】:

    • 你会尝试做一个 plunker 吗?
    猜你喜欢
    • 2021-07-11
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2017-12-24
    • 2018-09-15
    • 2021-03-16
    相关资源
    最近更新 更多