Mamy komponent, który ma dynamicznie budowaną formę. Kod dodający kontrolkę z walidatorami może wyglądać następująco:
var c = new FormControl('', Validators.required);
Ale powiedzmy, że chcę dodać drugi walidator później . Jak możemy to osiągnąć? Nie możemy znaleźć żadnej dokumentacji na ten temat w Internecie. Znalazłem chociaż w kontrolkach formularza jest setValidators
this.form.controls["firstName"].setValidators
ale nie jest jasne, jak dodać nowy lub niestandardowy walidator.
angular
forms
angular-reactive-forms
melegant
źródło
źródło
.updateValueAndValidity()
kontrolę formularza po ustawieniu nowych walidatorów.Aby dodać do tego, co opublikował @Delosdos.
Ustaw walidator dla kontrolki w
FormGroup
:this.myForm.controls['controlName'].setValidators([Validators.required])
Usuń walidator z kontrolki w FormGroup:
this.myForm.controls['controlName'].clearValidators()
Zaktualizuj FormGroup po uruchomieniu jednej z powyższych linii.
this.myForm.controls['controlName'].updateValueAndValidity()
To niesamowity sposób na programowe ustawianie walidacji formularza.
źródło
updateValueAndValidity
metodzie, może się kiedyś przydać!updateValueAndValidity
jest nadal używany do sprawdzania poprawności i nie jest obsługiwany inaczej w nowszych wersjach Angular. To, co się dzieje,setValidators
aktualizuje walidatory, ale nie uruchamia sprawdzania poprawności, a następnie służyupdateValueAndValidity
do przeprowadzania walidacji. Musisz ustawić walidatory w punkcie, w którym wykrywanie zmian zajmie się tym za Ciebie, ale przekonasz się, że użycieupdateValueAndValidity
w grupie lub kontrolce zależy od tego, który walidator właśnie ustawiłeś jako kluczowy - github.com/angular/angular/issues/19622#issuecomment- 341547884 .updateValueAndValidity
. Dzięki @shammelburg!updateValueAndValidity()
, ale w niektórych przypadkach nie. jeśli dodałeśupdateValueAndValidity()
posetValidators()
To natychmiast wpłynie na zmiany związane z kontrolą . Dlatego lepiej jest dodać updateValueAndValidity () `.Jeśli używasz reactiveFormModule i masz formGroup zdefiniowaną w ten sposób:
niż jesteś w stanie dodać nowy walidator ( i zachować stare ) do FormControl w ten sposób:
FormControl.validator zwraca walidator kompozycji zawierający wszystkie wcześniej zdefiniowane walidatory.
źródło
control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);
się obejść surowe kontrole zeroweMyślę, że wybrana odpowiedź jest nieprawidłowa, ponieważ pierwotne pytanie brzmi: „jak dodać nowy walidator po utworzeniu formControl”.
O ile wiem, to niemożliwe. Jedyne, co możesz zrobić, to dynamicznie utworzyć tablicę walidatorów.
Jednak brakuje nam funkcji addValidator (), która nie przesłania walidatorów już dodanych do formControl. Jeśli ktoś ma odpowiedź na to wymaganie, byłoby miło zostać opublikowanym tutaj.
źródło
control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);
że zadziała.Oprócz odpowiedzi Eduarda Voida, oto
addValidators
metoda:Za jego pomocą możesz dynamicznie ustawiać walidatory:
źródło