2016-09-24 1 views
9

Ich versuche, die disabled in meinem modellgesteuerten Formular zu verwenden. Ich habe die folgende Form:Verwenden Sie deaktivieren mit modellgesteuerten Formular

this.form = this.formBuilder.group({ 
    val1: ['', Validators.required], 
    val2: [{value:'', disabled:this.form.controls.val1.valid}] 
}); 

Ich erhalte eine Fehlermeldung (nicht controls von this.form finden) wahrscheinlich, weil ich this.form innen this.form bin mit.

Wie kann ich das beheben?

PS Ich habe auch versucht [disabled]='...' in meinem html hinzufügen, aber ich erhalte eine Warnung sagen, dass ich die Formbuilder verwenden sollte stattdessen

+0

hey ist es nicht sein soll 'val1: fb.control ('', Validators.required) 'und du musst auch val 2 ändern? – Ced

+0

@Ced können Sie dies lesen: https://scotch.io/tutorials/using-angular-2s-model-driven-forms-with-formgroup-and-formcontrol#initialize-the-form-model – ncohen

+0

es sagt was ich sagte aber. Weiß nicht, ob ich aus der Schleife bin. Überprüfen Sie meine Antwort, wenn es komplett nicht das ist, was Sie wollten, dann werde ich es entfernen – Ced

Antwort

20

Ja, Sie haben Recht, dass das Problem ist, weil Sie eine Variable (this.form) referenzieren wenn es noch nicht initiiert ist. Glücklicherweise müssen Sie in Ihrer val2 Formularsteuerung nicht wirklich auf die Formulargruppe verweisen. Ihr Code kann wie folgt neu geschrieben werden:

let val1Control = this.formBuilder.control('', Validators.required); 
this.form = this.formBuilder.group({ 
    val1: val1Control , 
    val2: [{value:'', disabled: val1Control.valid}] 
}); 

jedoch dieser Block initiiert nur den disabled Wert von val2 Kontrolle ohne val1Control ‚s Gültigkeit zu überwachen. Um das zu tun, müssen Sie val1Control.statusChanges abonnieren:

let val1Control = this.formBuilder.control('', Validators.required); 
let val2Control = this.formBuilder.control({value:'', disabled: !val1Control.valid}); 
this.form = this.formBuilder.group({ 
    val1: val1Control, 
    val2: val2Control 
}) 

val1Control.statusChanges.subscribe((newStatus) => { 
    if (val1Control.valid) { 
    val2Control.enable(); 
    } else { 
    val2Control.disable(); 
    } 
}); 

Hier ist der Arbeits Plunker: http://plnkr.co/edit/kEoX2hN9UcY4yNS3B5NF

+3

AUTSCH, das ist super wortreich ... Ich habe nicht erwartet, dass ein "Behinderter" so komplex ist! Wie auch immer, es ist die beste Lösung, denke ich! Danke – ncohen

+0

Schön! Habe meine Zeit gerettet. –

+3

Hat mir sehr geholfen, vielen Dank! In meinem Fall (und wenn Sie jedes Formularfeld deaktivieren möchten) 'this.form.disable();' hat perfekt funktioniert! –

Verwandte Themen