2017-06-20 4 views
0

Ich habe ein Problem eine Checkbox zu machen in einer dynamischen Form arbeitet Angular mit 4.Wie man eine Checkbox in einem Augular dynamischen Formular verwaltet?

auf Firefox, wenn Sie das Kontrollkästchen Überprüfung der Wert I erhalten ist 'on' anstelle von true. Und wenn es deaktiviert wird, ist der Wert immer noch vorhanden und nicht auf false oder '' eingestellt.

Auf Chrom, ist es gar nicht zu funktionieren scheint ...

Ich habe ein Beispiel basiert auf dem Angular dynamic form tutorial erstellt.

Ich habe eine neue Datei mit dem Namen question-checkbox.ts hinzugefügt eine Checkbox zu verwalten:

import { QuestionBase } from './question-base'; 

export class CheckboxQuestion extends QuestionBase<boolean> { 
    controlType = 'checkbox'; 
    type: string; 

    constructor(options: {} = {}) { 
    super(options); 
    this.type = 'checkbox'; 
    } 
} 

Dann habe ich die dynamic-form-question.component.html aktualisiert, um diese neue Art zu verwenden:

<div [formGroup]="form"> 
    <label [attr.for]="question.key">{{question.label}}</label> 
    <div [ngSwitch]="question.controlType"> 
    <select [id]="question.key" *ngSwitchCase="'dropdown'" [formControlName]="question.key"> 
     <option *ngFor="let opt of question.options" [value]="opt.key">{{opt.value}}</option> 
    </select> 
    <input *ngSwitchDefault [formControlName]="question.key" [id]="question.key" [type]="question.type" /> 
    </div> 
    <div class="errorMessage" *ngIf="!isValid">{{question.label}} is required</div> 
</div> 

Und ich habe die aktualisierte Datensatz in question.service.ts:

import { Injectable }  from '@angular/core'; 
import { DropdownQuestion } from './question-dropdown'; 
import { QuestionBase }  from './question-base'; 
import { TextboxQuestion } from './question-textbox'; 
import { CheckboxQuestion } from './question-checkbox'; 

@Injectable() 
export class QuestionService { 

    getQuestions() { 

    let questions: QuestionBase<any>[] = [ 

     new DropdownQuestion({ 
     key: 'brave', 
     label: 'Bravery Rating', 
     options: [ 
      { key: 'solid', value: 'Solid' }, 
      { key: 'great', value: 'Great' }, 
      { key: 'good', value: 'Good' }, 
      { key: 'unproven', value: 'Unproven' } 
     ], 
     order: 3 
     }), 

     new TextboxQuestion({ 
     key: 'firstName', 
     label: 'First name', 
     value: 'Bombasto', 
     required: true, 
     order: 1 
     }), 

     new TextboxQuestion({ 
     key: 'emailAddress', 
     label: 'Email', 
     type: 'email', 
     order: 2 
     }), 

     new CheckboxQuestion({ 
     key: 'sideksick', 
     label: 'Sidekick', 
     order: 3 
     }) 
    ]; 

    return questions.sort((a, b) => a.order - b.order); 
    } 
} 

Schließlich habe ich auf datiert die dynamic-form.component.html den aktuellen Stand der Form angezeigt werden:

<div> 
    <form [formGroup]="form"> 
    <div *ngFor="let question of questions" class="form-row"> 
     <df-question [question]="question" [form]="form"></df-question> 
    </div> 
    </form> 
    <p><strong>Current state</strong><br>{{form.value | json}}</p> 
</div> 

Example available on Plunker

So meine Frage wäre: Wie sollte ich in der Lage zu tun sein Kontrollkästchen innerhalb eines Winkel 4 dynamische Form zu verwenden, und in der Lage sein, um einen korrekten Wert zu erhalten?

Warum ich ein dynamisches Formular verwenden muss, liegt daran, dass ich mein Formular basierend auf einem JSON erzeuge, das von einem externen Dienst stammt und es beschreibt.

Antwort

0

Neue Antwort

Es scheint, dass es ein wirklich seltsames Verhalten ist, das dieses Problem mit kantigem 4.x. verursachen

Schreiben das wird nicht funktionieren:

<input *ngSwitchCase="'checkbox'" [formControlName]="question.key" [id]="question.key" [type]="'checkbox'" /> 

Aber schreibe dies funktioniert:

<input *ngSwitchCase="'checkbox'" [formControlName]="question.key" [id]="question.key" type="checkbox" /> 

Der einzige Unterschied ist, dass wir nicht Angular Template-Funktionen verwenden Sie ([type]="question.type", [attr.type]="question.type" oder type={{question.type}}), um den Inhalt von type zu schreiben, und so verwenden wir nur die native type von HTML.
Das scheint mir ein Fehler ...

Hier die fix on Plunker.


Alte Antwort

Die Lösung oben ist die einzige, die Sie berücksichtigen sollten.

fand ich einen Hinweis aus der Antwort von angular2-dynamic-form-checkbox.

mir fehlte der folgende Teil in der Datei dynamic-form-question.component.html: [(ngModel)]="question.value" (change)="question.value = ckb.checked" #ckb.

<select [id]="question.key" *ngSwitchCase="'dropdown'" [formControlName]="question.key"> 
    <option *ngFor="let opt of question.options" [value]="opt.key">{{opt.value}}</option> 
</select> 
<input *ngSwitchCase="'checkbox'" [formControlName]="question.key" [id]="question.key" [type]="question.type" [(ngModel)]="question.value" (change)="question.value = ckb.checked" #ckb /> 
<input *ngSwitchDefault [formControlName]="question.key" [id]="question.key" [type]="question.type" /> 

Es scheint, dass im Fall einer dynamischen Form, Kontrollkästchen verwalten, wird nicht automatisch, und so müssen wir ihren Wert auf change in Abhängigkeit von dem checked Zustand der Checkbox aktualisieren.

Hier die fix on Plunker.

Verwandte Themen