2017-10-14 27 views
0

我有一个我从后端获得的兴趣列表。我希望用户能够选择他们想要的兴趣。我将只存储他们在数据库中检查的兴趣,并在他们加载页面时进行预填充。但首先,我需要获得用户选择的这些兴趣。角+材料 - 如何处理与表单组的多个复选框

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

} 

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> 

在我关于改变事件的console.log它示出了没有被添加到利益阵列内的值的interestFormGroup。即使是复选框也会被检查。

回答

3

您应该添加控件FormArray手动喜欢:

this.interests = res; 
const formArray = this.interestFormGroup.get('interests') as FormArray; 
this.interests.forEach(x => formArray.push(new FormControl(false))); 

然后更改模板如下:

<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> 

而当你将提交表单,您需要转换FormArray值您想要的结果:

submit() { 
    const result = Object.assign({}, 
    this.interestFormGroup.value, { 
     interests: this.interests 
     .filter((x, i) => !!this.interestFormGroup.value.interests[i])}); 

    console.log(result); 
} 

替代解决方案是听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); 
    } 
} 

Stackblitz example

+0

从stackblitz那不是我想要的,它返回true数组,虚假的价值观,当我真正想要的价值的利益。由于真值和假值实际上并不告诉我什么兴趣被选中,因为关键是指数。我甚至不知道为什么在这里添加索引?看起来像一个过于复杂的解决方案的东西本来是简单的。 – 2017-10-15 08:28:07

+0

所以在那个stackbltiz示例中,它应该返回值为interest1,interest2,interest3而不是0的兴趣数组:true 1:true 2:true – 2017-10-15 08:33:43

+0

您是否尝试提交表单?看看控制台 – yurzui