使用响应式将复选框绑定到值而不是 true/false

Bind checkbox to value instead of true/false with reactive forms

我试图获得一个使用 reactive/model 驱动表单的简单示例。我想将复选框数组绑定到值列表,而不是布尔值列表。

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

复选框值已选中 (true) 或未选中 (false)。 一般来说,复选框具有另一个值没有意义,但如果您仍然想这样做,则需要编写自己的复选框值评估程序。

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+ 有盒装香蕉符号直接绑定到模型,但该数据类型必须是布尔值才能与复选框一起使用:

<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'"/>