2017-07-14 1 views
1

Hallo, Ich bin der Gestaltung checbox mit mehreren Werten, aber wenn ich ein Checkbox klicken wählt sie alleBeim Klicken auf ein Kontrollkästchen markiert alle Warum?

<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

Sehen Sie diese Frage, es ist ziemlich nah an dem, was Sie versuchen zu tun. https://stackoverflow.com/q/45085453/5556177 – Nehal

+0

Sie haben eine reaktive Form? Es wird davon abgeraten, es zusammen mit ngModel zu verwenden. Ich wundere mich über den formcontrolname, denn wenn Sie mehrere Kontrollkästchen haben möchten, wird es nicht mit einem Formular-Steuerelement funktionieren, da es nur einen Wert erfassen kann, würde ich sagen, Sie möchten ein Formularfeld. – Alex

+0

Hey, wie ist es mit den Antworten gelaufen? Hat Ihnen geholfen oder benötigen Sie weitere Hilfe? :) – Alex

Antwort

1

Verwenden [geprüft] anstelle von [(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

aber ich muss überprüfte Daten speichern speichern ist es möglich ohne [(ngModel)] – kishore

1

Da Sie eine reaktive Form verwenden, verwenden Sie sie. Es wird davon abgeraten, ngModel mit einer reaktiven Form zu verwenden. In der ReactiveFormsModule ist die ngModel Direktive nicht einmal enthalten.

Da Sie mehrere Kontrollkästchen haben, sollten Sie einen FormArray verwenden, um die Werte zu erfassen. Wir könnten dieses FormArray objectiveOfUtilisingServiceControls nennen.

Dann haben wir eine Methode zum Hinzufügen oder Entfernen der Elemente zum Formular-Array. Wir haben ein Änderungsereignis in der Vorlage, in dem wir die boolean der Checkbox übergeben, das heißt, wenn es aktiviert ist oder nicht, sowie der Artikel wir in der Form Array hinzufügen mögen:

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

Die onChange Verfahren würde wie folgt aussehen:

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

Wo wir entweder ein neues FormControl zum Formular Array drücken, oder wenn es nicht markiert ist, die wir in Form von Steuer Form Array entfernen.

Da Sie einen Wert haben, der bereits überprüft wurde, müssen wir ihn auch im Formular-Array hinzufügen. Wir können es tun, nachdem wir die Form aufgebaut haben, die wie folgt aussehen: (fb bezieht sich auf Formbuilder)

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

Und wie für den prechecked Wert in der Vorlage, nur verwenden [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> 

und wenn Sie das Formular absenden, haben Sie alle Werte des Formulars in myForm.value, ändern Sie einfach myForm zu dem tatsächlichen Formularnamen, den Sie haben.

+0

Hier ist eine Demo für Sie: http://plnkr.co/edit/fWabRFY5q1mULEMRceSn – Alex

Verwandte Themen