Kay*_*Kay 13 angular-material angular
我有一份从后端获得的兴趣列表.我希望用户能够选择他们想要的兴趣.我将仅存储他们在数据库中检查的兴趣,并在加载页面时预先填充.但首先我需要获得用户选择的这些兴趣.
interest.component.ts
export class InterestsComponent implements OnInit {
interestFormGroup : FormGroup
interests:any;
selected: any;
constructor(public interestService: InterestService, private formBuilder: FormBuilder,
) { }
ngOnInit() {
this.interestFormGroup = this.formBuilder.group({
interests: this.formBuilder.array([])
});
this.interestService.all().subscribe((res) => {
this.interests = res;
});
}
change() {
console.log(this.interestFormGroup.value);
}
}
Run Code Online (Sandbox Code Playgroud)
interest.component.html
<div id="interest">
<div class="interest-list">
<form [formGroup]="interestFormGroup">
<div *ngFor="let interest of interests" >
<mat-checkbox class="example-margin" formNameArray="interests" (change)="change()">{{interest}}</mat-checkbox>
</div>
</form>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
在我更改事件的console.log中,它显示没有值被添加到interestFormGroup中的interests数组.甚至选中复选框.
yur*_*zui 17
您应该FormArray手动添加控件,如:
this.interests = res;
const formArray = this.interestFormGroup.get('interests') as FormArray;
this.interests.forEach(x => formArray.push(new FormControl(false)));
Run Code Online (Sandbox Code Playgroud)
然后按如下方式更改模板:
<form [formGroup]="interestFormGroup" (ngSubmit)="submit()">
<ng-container formArrayName="interests">
<div *ngFor="let interest of interests; let i = index" >
<mat-checkbox class="example-margin" [formControlName]="i">
{{interest}}
</mat-checkbox>
</div>
</ng-container>
<button>Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)
当您提交表单时,您需要将FormArray值转换为您想要的结果:
submit() {
const result = Object.assign({},
this.interestFormGroup.value, {
interests: this.interests
.filter((x, i) => !!this.interestFormGroup.value.interests[i])});
console.log(result);
}
Run Code Online (Sandbox Code Playgroud)
替代解决方案是监听change事件并手动添加和删除值FormArray:
<div *ngFor="let interest of interests; let i = index" >
<mat-checkbox class="example-margin"
(change)="onChange($event)" [value]="interest">{{interest}}</mat-checkbox>
</div>
onChange(event) {
const interests = <FormArray>this.interestFormGroup.get('interests') as FormArray;
if(event.checked) {
interests.push(new FormControl(event.source.value))
} else {
const i = interests.controls.findIndex(x => x.value === event.source.value);
interests.removeAt(i);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21892 次 |
| 最近记录: |