Forms Angular 2:在ng2中使用FormBuilder和FormArray有没有简单的方法? 处境
我正在制作一个表格,其中我想列出一些邮件,除了主题之外还有一个复选框,在其他复选框的同一列中还有一个“全选”复选框 表单看起来很简单,如下所示:Forms Angular 2:在ng2中使用FormBuilder和FormArray有没有简单的方法? 处境,forms,angular,formbuilder,Forms,Angular,Formbuilder,我正在制作一个表格,其中我想列出一些邮件,除了主题之外还有一个复选框,在其他复选框的同一列中还有一个“全选”复选框 表单看起来很简单,如下所示: [ ] Check all ------------------------------------------ [ ] This is email subject #1 [ ] This is email subject #2 [ ] ... 当我选择Check all时,应选中以下所有复选框,当我再次单击时,应取消选中所有邮件 邮件通过@Inp
[ ] Check all
------------------------------------------
[ ] This is email subject #1
[ ] This is email subject #2
[ ] ...
- 当我选择
时,应选中以下所有复选框,当我再次单击时,应取消选中所有邮件Check all
- 邮件通过
动态进入组件,列表可以在任何时间点更改@Input
- 我认为可能会出现竞争条件/计时问题:我迭代了
提供的@Input
数组,但我在模板中将邮件
手动连接到相应的索引。每当检查邮件列表
发生变化时,我就会迭代所有@Input
邮件。我不知道Angular是否首先迭代模板中的所有
,然后运行邮件
方法,反之亦然。有人能给我一个深刻的答案吗ngOnChange
表单是每个WebApp的基本组成部分。我做得对吗?任何帮助都将不胜感激。如果您对输入进行了设置,并在那里重新填充表单控件,该怎么办?
<form [formGroup]="form">
<div><input formControlName="toggleAll" type="checkbox"></div>
<div>
<ul formArrayName="checkMailList">
<li *ngFor="let mail of mails; let i=index">
<input type="checkbox" [formControlName]="i">
<div>mail.subject</div>
</li>
</ul>
</div>
</form>
@Component({ ... })
export class MailListComponent implements OnChanges {
@Input() mails: Mail[];
private get checkMailList(): FormArray { return this.form.get('checkMailList') as FormArray; }
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
checkMailList: this.fb.array([]);
});
}
ngOnChanges(changes: SimpleChanges) {
if (!changes['mails'] || !changes['mails'].currentValue) {
return;
}
// remove array first from form, as we will get
// mails again when anything updates
if (this.checkMailList.length > 0) {
this.form.removeControl('checkMailList');
this.form.addControl('checkMailList', this.fb.array([]));
}
this.mails.forEach(m => {
this.checkMailList.push(this.fb.control());
});
this.form
.valueChanges
.pluck('toggleAll')
.distinctUntilChanged()
.subscribe(selectAll => {
if (selectAll) {
this.checkMailList.setValue(this.mails.map(_ => true));
} else {
this.checkMailList.reset();
}
});
}
}