Wie soll ich gehen, bedingt ein Formularfeld erforderlich? Ich habe einen benutzerdefinierten Validator erstellt, aber die bedingten Variablen, die ich an den benutzerdefinierten Validator übergebe, sind statisch und bleiben ihre Anfangswerte. Wie sollte mein benutzerdefinierter Validator aussehen, um aktualisierte bedingte Werte zu erhalten? Vielleicht gibt es eine Möglichkeit, dies mit Validators.required
anstelle eines benutzerdefinierten Validators zu tun?Angular 2 conditional Validators.required?
private foo: boolean = false;
private bar: boolean = true;
constructor(private _fb: FormBuilder) {
function conditionalRequired(...conditions: boolean[]) {
return (control: Control): { [s: string]: boolean } => {
let required: boolean = true;
for (var i = 0; i < conditions.length; i++) {
if (conditions[i] === false) {
required = false;
}
}
if (required && !control.value) {
return { required: true }
}
}
}
this.applyForm = _fb.group({
'firstName': ['', Validators.compose([
conditionalRequired(this.foo, !this.bar)
])],
...
});
}
Update (17. Mai 2016)
Es gewesen eine lange Zeit, das seit der Veröffentlichung, aber ich mag die .include()
und .exclude()
Methoden, die auf der ControlGroup
Klasse für jemanden da draußen referenzieren Wer versucht, diese Funktionalität zu erstellen. (docs) Während es wahrscheinlich Anwendungsfälle für einen bedingten Validator wie oben gibt, habe ich die Aufnahme und den Ausschluss von Steuerelementen, Steuerelementgruppen und Steuerelementarrays als eine gute Möglichkeit gefunden, um damit umzugehen. Setzen Sie einfach den required
Validator auf das Steuerelement, das Sie möchten, und schließen Sie es nach Belieben ein oder aus. Hoffe das hilft jemandem!
ich sieht gut aus ;-) –
Aber wenn ich 'foo' true an anderer Stelle zu ändern, der benutzerdefinierten Validator zeigt "foo" immer noch als falsch an. Ein 'console.log (conditions)' im Validator zu werfen, gibt '[false, false]' zurück, wenn ich weiß, dass 'foo' tatsächlich wahr ist. Ich muss "[wahr, falsch]" bekommen. Ich nehme an, dass das ist, weil die Bedingungen einmal festgelegt werden, da es innerhalb des Konstruktors ist. Irgendeine Möglichkeit, dieses Verhalten zu umgehen? –
Der Link zu den Dokumenten im Update ist gebrochen – surfbird0713