今早 (2017-06-20) 收到 深夜徘徊
的邀请,让我帮忙解答 - angular2如何双向绑定多个checkbox? 这个问题。具体问题以下:html
好比我又一个数组以下:typescript
var array = ['喜欢','不喜欢','很是喜欢','超级喜欢','喜欢得不得了'];html模板中segmentfault
<div class="like" *ngFor="let e of array"> <input type="checkbox" name="like" value="{{e}}"> </div> <div class="youselect"></div>我盖如何实现,选中其中一个checkbox后,能在div.youselect中显示出我已经选中的内容,若是是多选,则呈现出数组或者以逗号隔开的形式数组
好比我选中了“喜欢”,“喜欢得不得了”,那么div.youselect中则显示出:“喜欢,喜欢得不得了”angular2
可使用formArray等方式进行,可是我在使用过程当中都没有实现。但愿大神出手帮帮忙!app
要实现他的需求有两种方式,使用 Template-driven 表单或 Reactive 表单。对于 Reactive 表单中毒太深的我,首先想到的固然是使用 Reactive 的方式哈。若对 Template-driven 方式感兴趣的同窗,能够参考 _CRY 的回答哈。废话很少说了,直接来看一下具体实现哈。框架
import { Component, OnInit } from '@angular/core'; import {FormBuilder, FormGroup, FormArray} from '@angular/forms'; @Component({ selector: 'app-root', template: ` <form [formGroup]="myForm" (ngSubmit)="onSubmit()"> <div class="like" *ngFor="let like of likes.controls; let i = index;"> <input type="checkbox" [formControl]="like"> {{likesArr[i].name}} </div> <div class="youselect">{{selects}}</div> <button type="submit">提交</button> </form> `, }) export class AppComponent implements OnInit{ myForm: FormGroup; likesArr= [ {id: 0, name: '喜欢', selected: true}, {id: 0, name: '不喜欢', selected: true}, {id: 0, name: '很是喜欢', selected: false}, {id: 0, name: '超级喜欢', selected: false}, {id: 0, name: '喜欢得不得了', selected: false} ]; selects: string[] = []; constructor(private fb: FormBuilder) {} ngOnInit() { this.myForm = this.fb.group({ likes: this.buildLikes() }); this.buildSelected(); this.likes.valueChanges.subscribe(values => { let selects: string[] = []; values.forEach((selected: boolean ,i: number) => { selected === true && selects.push(this.likesArr[i].name) }); this.selects = selects; }); } buildLikes(): FormArray { return this.fb.array( this.likesArr.map(like => { return this.fb.control(like.selected); }) ); } buildSelected() { this.likesArr.forEach((like) => { if(like.selected) this.selects.push(like.name); }); } get likes () { return this.myForm.get('likes'); } onSubmit() { // 根据实际要求进行数据处理 console.dir(this.myForm.value.likes); } }
使用方便异步
适用于简单的场景单元测试
经过 [(ngModel)] 实现数据双向绑定测试
最小化组件类的代码
不易于单元测试
异步建立表单控件
比较灵活
适用于复杂的场景
简化了HTML模板的代码,把验证逻辑抽离到组件类中
方便的跟踪表单控件值的变化
易于动态添加表单控件
易于单元测试
formGroup
formControl
formControlName
formGroupName
formArrayName
在 Angular 4 中有多种方式能够更新表单的值,对于使用响应式表单的场景,咱们能够经过框架内部提供的 API ,如 patchValue 和 setValue 方便地更新表单的值。setValue() 方法须要设置全部表单的值,而patchValue() 只需设置部分值。
this.signupForm.patch({ email: '24065****@qq.com' });
this.signupForm.setValue({ userName: 'semlinker', email: '24065****@qq.com' });
若想进一步了解详细信息,请参考 - Angular 4.x Forms patchValue and setValue。