2017-07-14 3 views
1

こんにちは、私は複数の値を持つchecboxを設計していますが、私は1つの のチェックボックスをクリックしたときには、すべてのクリックすると、すべての理由が選択されます。

<div [ngClass] = "{'form-group': true}"> 
       <label>{{initialInformationDetails.objectiveOfUtilisingServiceText}}</label> 
      <div> 
       <label *ngFor = "let objective of initialInformationDetails.objectiveOfUtilisingService"> 
       <input type="checkbox" 
         name="objective" 
         formControlName = "objectiveOfUtilisingServiceControl" 
         value="{{objective.value}}" 
         [(ngModel)]="userInfo.objective"/> {{objective.value}} 
       </label> 
       </div> 
      </div> 
+0

この質問は、あなたがしようとしていることにかなり近いです。 https://stackoverflow.com/q/45085453/5556177 – Nehal

+0

あなたは反応型ですか? ngModelと一緒に使用することはお勧めできません。私はformcontrolnameに疑問を抱いています。なぜなら、複数のチェックボックスが必要な場合、フォームコントロールでは機能しません。これは1つの値しか取り込めないため、formarrayが必要です。 – Alex

+0

ちょっと、答えにどうやって行ったのですか?あなたを助けてくれましたか、さらに助けが必要でしたか? :) – Alex

答えて

1

使用[確認]の代わりに[(ngModel)]を選択し

<div [ngClass] = "{'form-group': true}"> 
       <label>{{initialInformationDetails.objectiveOfUtilisingServiceText}}</label> 
      <div> 
       <label *ngFor = "let objective of initialInformationDetails.objectiveOfUtilisingService"> 
       <input type="checkbox" 
         name="objective" 
         formControlName = "objectiveOfUtilisingServiceControl" 
         value="{{objective.value}}" 
         [checked]="userInfo.objective"/> {{objective.value}} 
       </label> 
     </div> 
</div> 
+0

しかし、私は[(ngModel)]なしで可能ですチェックされたデータを保存する必要があります – kishore

1

反応的なフォームを使用しているので、それを利用してください。反応性のある形でngModelを使用することはお勧めしません。 ReactiveFormsModuleには、ngModel指示文も含まれていません。

複数のチェックボックスがあるので、値をキャプチャするにはFormArrayを使用する必要があります。 FormArray objectiveOfUtilisingServiceControlsと呼ぶことができます。

次に、フォーム配列にアイテムを追加または削除する方法があります。 onChange

(change)="onChange(objective.value, $event.target.checked)" 

:私たちは、テンプレートに変更イベントを持っている私たちは、チェックボックスのブール値を渡している、それが確認されたりいない場合は意味だけでなく、我々はフォームの配列に追加する実際のアイテム我々は、フォームの配列に新しいFormControlを押すか、それがオフになっている場合、我々はフォームの配列からフォームコントロールを削除

onChange(value:string, isChecked: boolean) { 
    let objectiveOfUtilisingServiceControls = 
       <FormArray>this.myForm.controls.objectiveOfUtilisingServiceControls; 

    if(isChecked) { 
    objectiveOfUtilisingServiceControls.push(new FormControl(value)); 
    } else { 
    let index = 
     objectiveOfUtilisingServiceControls.controls.findIndex(x => x.value == value) 
    objectiveOfUtilisingServiceControls.removeAt(index); 
    } 
} 

:メソッドは次のようになります。

事前チェックされている値があるので、最初にフォーム配列にその値を追加する必要があります。 (fbFormbuilderを参照している)

ngOnInit() { 
    // build form 
    this.myForm = this.fb.group({ 
    objectiveOfUtilisingServiceControls: this.fb.array([]) 
    }); 

//iterate and check which object matches the with the value in 'userInfo.objective' 
for (let obj of this.initialInformationDetails.objectiveOfUtilisingService) { 
    if (obj.value == this.userInfo.objective) { 
     this.onChange(obj.value, true) 
     break; 
    } 
    } 
} 

、テンプレートでprechecked値としては、ちょうど[checked]を使用します:

を、私たちはこのように見ることができるフォームを、内蔵された後に我々はそれを行うことができます
<label *ngFor="let objective of initialInformationDetails.objectiveOfUtilisingService"> 
    <input type="checkbox" (change)="onChange(objective.value, $event.target.checked)" 
     [checked]="userInfo.objective == objective.value"/> {{objective.value}} 
</label> 

フォームを送信するときは、フォームのすべての値がmyForm.valueになっています。ちょうどmyFormを実際のフォーム名に変更してください。

+0

あなたのためのデモがあります:http://plnkr.co/edit/fWabRFY5q1mULEMRceSn – Alex

関連する問題