2015-08-27 6 views
31

In angular2 Ich möchte Validatoren für einige Steuerelemente auslösen, wenn ein anderes Steuerelement geändert wird. Gibt es eine Möglichkeit, dass ich dem Formular einfach sagen kann, es erneut zu validieren? Besser noch, kann ich die Validierung bestimmter Felder beantragen?Auslösen von Formularvalidatoren in angular2

Beispiel: Gegeben Ankreuzfeld X und Eingabe P. Eingang P ein Validator hat, die auf dem Modellwert von X anders verhält basierend Wenn X markiert ist/nicht markiert I vom Validator auf P. Der Validator auf aufzurufen P betrachtet das Modell, um den Zustand von X zu bestimmen, und validiert P entsprechend.

Hier einige Code:

constructor(builder: FormBuilder) { 
    this.formData = { num: '', checkbox: false }; 

    this.formGp = builder.group({ 
     numberFld: [this.formData.num, myValidators.numericRange], 
     checkboxFld: [this.formData.checkbox], 
    }); 
} 

this.formGp.controls['checkboxFld'].valueChanges.observer({ 
    next: (value) => { 
     // I want to be able to do something like the following line: 
     this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']); 
    } 
}); 

Wer eine Lösung? Vielen Dank!

+0

Versuchen Sie gerade, die Validierung basierend auf dem Wert von X zu aktivieren/deaktivieren? Welche Art von Validatoren benutzt du? Sie können veranlassen, dass Validierer basierend auf einer Bedingung in Ihrem Bereich ausgeführt werden, aber ich bin mir nicht sicher, ob dieser Ansatz für Sie funktioniert. Siehe: http://stackoverflow.com/questions/21370006/angular-conditional-email-validation –

+0

@ stephen.vakil - Ich benutze angular2. – Bonneville

+0

@Bonneville Könnten Sie bitte erläutern, wie Sie den Checkbox-Status an die Validator-Funktion übergeben? –

Antwort

34

Ich weiß nicht, wenn Sie noch nach einer Antwort suchen, ist so hier meine Vorschläge:

einen Blick auf diese: Angular 2 - AbstractControl

Ich denke, was Sie tun können, ist folgende:

this.formGp.controls['checkboxFld'].valueChanges.observer({ 
    next: (value) => { 
     this.formGp.controls['numberFld'].updateValueAndValidity(); 
    } 
}); 

Dies sollte die Validatoren auslösen und ausführen. Außerdem wird der Status aktualisiert. Jetzt sollten Sie in der Lage sein, den Checkbox-Wert in Ihrer Validierungslogik zu konsultieren.

Hoffe, das hilft!

EDIT: Aktualisierter Link und Beispiel. Code geändert, während ich meine Antwort schrieb.

EDIT_2: alpha.48 ändert den EventEmitter.observer zu EventEmitter.subscribe!

EDIT_3: Geänderte Link zur eigentlichen Implementierung hinzugefügt Link zu den Dokumenten

Validaton-Guide

FormControl Documentation

+0

Danke @Nightking für den Vorschlag, ich werde es ausprobieren. Beachten Sie, dass Ihr Link nicht funktioniert. – Bonneville

+0

@Bonneville Danke für die Informationen. Sie extrahierten den Formularcode in den allgemeinen Namespace. Dinge ändern sich ein bisschen zu schnell :). Ich habe den Link zur Quelle aktualisiert. – Nightking

+0

Ich bin endlich dazu gekommen, dieses Stück Code zu benutzen und es scheint für mich zu funktionieren. Vielen Dank! Übrigens gibt es einen Tippfehler in Ihrem Code: Der Buchstabe 'e' fehlt in der Funktion updateValueAndValidity(). Ihr Code hat Update statt Update. Prost, das war eine große Hilfe! – Bonneville

10

mit meiner Kontrollgruppe ich dies tun, weil ich Fehler divs habe überprüft, ob berührt

for (var i in this.form.controls) { 
    this.form.controls[i].markAsTouched(); 
} 

(this.form ist meine ControlGroup)

4

Es gibt elegantere Möglichkeiten, dieses Verhalten zu modellieren - zum Beispiel, indem Sie Ihren Status in ein ReplaySubject setzen und dies beobachten und dann asynchrone Validatoren verwenden, um den Zustand zu beobachten - aber der unten beschriebene pseudokodierte Ansatz sollte funktionieren. Sie beobachten einfach die Wertänderungen in der Checkbox, aktualisieren das Modell entsprechend und erzwingen dann eine erneute Validierung der numberFld mit der updateValueAndValidity cal.

constructor(builder: FormBuilder) { 
    this.formData = { num: '', checkbox: false }; 
    const numberFld = builder.control(this.formData.num, myValidators.numericRange); 

    const checkbox = builder.control(this.formData.checkbox); 
    checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => { 
    this.formData.checked = bool; 
    numberFld.updateValueAndValidity(); //triggers numberFld validation 
    }); 

    this.formGp = builder.group({ 
     numberFld: numberFld, 
     checkboxFld: checkbox 
    }); 
} 
Verwandte Themen