【问题标题】:Bind checkbox to value instead of true/false with reactive forms使用反应形式将复选框绑定到值而不是真/假
【发布时间】:2017-04-26 08:28:17
【问题描述】:

我正在尝试使用响应式/模型驱动的表单来制作一个简单的示例。我想将复选框数组绑定到值列表,而不是布尔值列表。

这个 plunker 显示了问题:http://plnkr.co/edit/a9OdMAq2YIwQFo7gixbj?p=preview 绑定到表单的值是布尔值,我希望答案类似于 ["value1", "value2", etc]

我有这样的东西,但我不知道如何得到我想要的结果?

模板:

<form [formGroup]="checkboxGroup">
    <input *ngFor="let control of checkboxGroup.controls['myValues'].controls" 
    type="checkbox" id="checkbox-1" value="value-1" [formControl]="control" />
</form>

还有组件:

let checkboxArray = new FormArray([
  new FormControl({checked: true, value: "value1"}),
  new FormControl({checked: false, value: "value2"}))]);

this.checkboxGroup = _fb.group({
  myValues: checkboxArray
});

【问题讨论】:

    标签: angular angular2-forms


    【解决方案1】:

    Angular.js (1.x) 有ng-true-value和ng-false-value,方便避免web表单和不灵活的后端之间的转换:

    <input type="checkbox" ng-model="vv[name]" ng-true-value="'1'" ng-false-value="'0'"/>
    

    Angular 2+ 具有可直接绑定到模型的“banana-in-a-box”表示法,但该数据类型必须是布尔型才能与复选框一起使用:

    <input type="checkbox" [(ngModel)]="vv[name]"/>
    

    如果你真的不能使用布尔值,[checked] 和 (change) 表示法是一个可行的替代品(在这种情况下,1 为真,0 为假):

    <input type="checkbox" [checked]="vv[name]==='1'"                                            
        (change)="vv[name]=$event.target.checked?'1':'0'"/>
    

    【讨论】:

      【解决方案2】:

      复选框值被选中 (true) 或未选中 (false)。 一般来说,复选框有另一个值是没有意义的,但如果你想这样做,你需要编写自己的复选框值评估器。

      【讨论】:

      • 想进一步详细说明?如果我用谷歌搜索 CheckboxValueAssessor 我会得到这个答案。
      • 我的 model 可能需要'Y''N' 的字符串,那么为什么我不能动态设置其[checked][value] 属性并将字符串保留在我的[(ngModel)]?
      • 这让我很沮丧,我不明白为什么 Angular 会这样做。 According to MDN,HTML 可以有一个值,并且只有在元素被“选中”时才会提交(值不限于 bool)。如果您最初设置它,它可以在 Angular 中使用,但是一旦您手动单击复选框一次,该值就会丢失并转换为简单的布尔值。
      猜你喜欢
      • 2018-03-02
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      相关资源
      最近更新 更多