W jaki sposób powinieneś wymagać warunkowo pola formularza? Zrobiłem własny weryfikator, ale zmienne warunkowe, które przekazuję do walidatora niestandardowego, są statyczne i pozostają ich wartościami początkowymi. Jak powinien wyglądać mój niestandardowy weryfikator, aby uzyskać zaktualizowane wartości warunkowe? Być może istnieje sposób, aby to zrobić z Validators.required
zamiast niestandardowego weryfikatora?Angular 2 Waritional 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)
])],
...
});
}
Aktualizacja (17 maja, 2016)
Minęło dużo czasu od opublikowania tego, ale chciałbym odwołać się do .include()
i .exclude()
metody dostępne w klasie ControlGroup
dla nikogo tam kto próbuje stworzyć tę funkcjonalność. (docs) Chociaż istnieją prawdopodobnie przypadki użycia warunkowego walidatora, jak wyżej, znalazłem włączenie i wyłączenie kontroli, grup kontrolnych i tablic kontrolnych, aby było to świetnym sposobem radzenia sobie z tym. Po prostu ustaw walidator required
na wybranej kontrolce i dołącz/wyklucz to, jak chcesz. Mam nadzieję, że to pomoże komuś!
wygląda dobrze do mnie ;-) –
Ale kiedy zmienić 'foo' do prawdziwego gdzie indziej, zwyczaj walidator nadal pokazuje 'foo' jako fałsz. Rzucanie 'console.log (warunkami)' w walidatorze zwraca '[false, false]' gdy wiem, że 'foo' faktycznie jest prawdziwe. Muszę uzyskać '[true, false]'. Zakładam, że tak jest, ponieważ warunki są ustawione raz, ponieważ są wewnątrz konstruktora. Jakikolwiek sposób obejścia tego zachowania? –
Link do dokumentów w aktualizacji jest zepsuty – surfbird0713