Czy jest możliwe utworzenie walidatora, który może używać wielu wartości do decydowania, czy moje pole jest prawidłowe?
np. jeśli preferowaną metodą kontaktu klienta jest e-mail, to pole e-mail powinno być wymagane.
Dzięki.
Zaktualizowano przykładowym kodem ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
orazequalTo
metod i dobrej dokumentacji!Odpowiedzi:
Aby w pewnym sensie powtórzyć metody opublikowane przez innych, w ten sposób tworzę
FormGroup
walidatory, które nie obejmują wielu grup.W tym przykładzie po prostu podaj nazwy kluczy pól
password
iconfirmPassword
.Aby
Validators
pobrać parametry, muszą zwrócić afunction
z parametremFormGroup
lubFormControl
jako parametr. W tym przypadku sprawdzam plikFormGroup
.Technicznie rzecz biorąc, mógłbym zweryfikować dowolne dwie wartości, gdybym znał ich klucze, ale wolę nazwać moje
Validators
tak samo, jak błąd, który zwrócą. Funkcję można zmodyfikować, aby pobierała trzeci parametr, który reprezentuje nazwę klucza zwróconego błędu.Zaktualizowano 6 grudnia 2016 r. (Wersja 2.2.4)
Pełny przykład: https://embed.plnkr.co/ukwCXm/
źródło
FormGroup
do obsługi walidacji w wielu polach zamiast umieszczaniaValidator
na całości.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Próbowałem tego, ale to nie działa. Jakieś sugestie ? @DaveOdpowiedź Dave'a była bardzo, bardzo pomocna. Jednak niewielka modyfikacja może pomóc niektórym osobom.
W przypadku konieczności dodania błędów do
Control
pól, możesz zachować faktyczną konstrukcję formularza i walidatorów:Zamiast ustawiać błąd w polu
ControlGroup
, zrób to na rzeczywistym polu w następujący sposób:źródło
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
welse
gałęzi, aby zaktualizować poprawnie, gdy zmiana wpasswordInput
spowoduje, że dane będą prawidłowe.TypeError: passwordConfirmationInput.validator is not a function
. Dzieje się tak, ponieważ nie utworzyłem jawnie FormControl z Validators.required. Zostawiłem walidatory puste i zamiast tego użyłem atrybutu „required” na wejściu.{[key: string]: any}
, którysetErrors(...)
nie zwraca (już?).setErrors(...)
Nadpisuje również wszelkie błędy, które już istnieją, więc dołączyłem do bieżącego obiektu błędu, takiego jak:let errors = formGroup.controls[passwordConfirmationKey].errors;
andif(!errors) errors={};
anderrors['notEquivalent'] = true;
andformGroup.controls[dateControlFirst].setErrors(errors);
Podczas implementacji walidatorów dla wielu pól formularza, będziesz musiał upewnić się, że walidatory są ponownie oceniane po zaktualizowaniu każdego z formantów formularza. Większość przykładów nie zapewnia rozwiązania dla takiego scenariusza, ale jest to bardzo ważne dla spójności danych i prawidłowego zachowania.
Zobacz moją implementację niestandardowego walidatora dla Angular 2, który bierze to pod uwagę: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Używam
otherControl.valueChanges.subscribe()
do nasłuchiwania zmian w innej kontrolce ithisControl.updateValueAndValidity()
do wyzwalania kolejnej rundy walidacji, gdy inna kontrolka zostanie zmieniona.Kopiuję poniższy kod do wykorzystania w przyszłości:
match-other-validator.ts
Stosowanie
Oto, jak możesz go używać z formularzami reaktywnymi:
Więcej aktualnych walidatorów można znaleźć tutaj: moebius-mlm / ng-validators .
źródło
this
? Właściwie dobrze jest mieć nazwaną funkcję do celów debugowania.othercontrol.valuechanges.subscribe
nigdzie nie został wypisany.valueChanges
obserwowalne, gdyotherControl
zostanie zniszczona, co spowoduje również zakończenie subskrypcji. Jednak Twoje obawy mogą być uzasadnione. Sugerowałbym gruntowne debugowanie tego kodu najnowszą wersją Angulara przy użyciu różnych przypadków testowych. Jeśli znajdziesz jakieś problemy, zgłoś się ponownie.Używam Angular 2 RC.5, ale nie mogłem znaleźć ControlGroup, na podstawie pomocnej odpowiedzi od Dave'a. Okazało się, że zamiast tego działa FormGroup. Zrobiłem więc kilka drobnych aktualizacji kodów Dave'a i pomyślałem, że podzielę się nimi z innymi.
W pliku komponentu dodaj import dla FormGroup:
Zdefiniuj swoje dane wejściowe na wypadek konieczności bezpośredniego dostępu do kontrolki formularza:
W konstruktorze utwórz wystąpienie formularza:
Dodaj funkcję matchingPasswords w swojej klasie:
Mam nadzieję, że pomoże to tym, którzy używają RC.5. Zauważ, że nie testowałem jeszcze RC.6.
źródło
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Dużo kopania w kanciastym źródle, ale znalazłem lepszy sposób.
Część HTML dotycząca grupy haseł
źródło
Aby rozwinąć odpowiedź Matthewdaniela, ponieważ nie jest ona dokładnie poprawna. Oto przykładowy kod, który pokazuje, jak poprawnie przypisać walidator do pliku
ControlGroup
.Oto działający przykład: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
źródło
ControlGroup
jest usuwany na korzyśćFormGroup
każdego, kto to ogląda. Docs and Learn Angular2 PrzykładOto kolejna opcja, którą udało mi się wymyślić, która nie zależy od całości lub sub,
ControlGroup
ale jest bezpośrednio powiązana z każdym z nichControl
.Problem, który miałem, polegał na tym, że kontrolki, które były od siebie zależne, nie były hierarchicznie połączone, więc nie mogłem utworzyć pliku
ControlGroup
. Ponadto, mój CSS został skonfigurowany tak, że każda kontrolka wykorzystywałaby istniejące klasy kątowe, aby określić, czy wyświetlać style błędów, co było bardziej skomplikowane w przypadku walidacji grupowej zamiast walidacji specyficznej dla kontrolki. Próba ustalenia, czy pojedyncza kontrola była ważna, nie była możliwa, ponieważ walidacja była powiązana z grupą kontroli, a nie z każdą indywidualną kontrolą.W moim przypadku chciałem, aby wartość pola wyboru określała, czy inne pole będzie wymagane, czy nie.
Jest to tworzone przy użyciu konstruktora formularzy w komponencie. W przypadku modelu wyboru zamiast bezpośredniego powiązania go z wartością obiektu żądania powiązałem go z funkcjami pobierania / ustawiania, które pozwolą mi obsługiwać zdarzenia „przy zmianie” dla kontrolki. Wtedy będę mógł ręcznie ustawić walidację dla innej kontrolki w zależności od nowej wartości wybranych kontrolek.
Oto odpowiednia część widoku:
Odpowiednia porcja składnika:
W moim przypadku zawsze miałem walidację wzorca powiązaną z kontrolką, więc
validator
jest zawsze ustawiona na coś, ale myślę, że możesz ustawić navalidator
null, jeśli nie masz żadnej walidacji powiązanej z kontrolką.AKTUALIZACJA: Istnieją inne metody przechwytywania zmian modelu, takie jak
(ngModelChange)=changeFunctionName($event)
lub subskrybowanie zmian wartości kontrolnych przy użyciuthis.form.controls["employee"].valueChanges.subscribe(data => ...))
źródło
Wypróbowałem większość tych odpowiedzi, ale żadna z nich nie zadziałała. Znalazłem działający przykład tutaj https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
źródło
equalTo
Również tego szukałem i ostatecznie korzystałem z pakietu ng2-validation ( https://www.npmjs.com/package/ng2-validation )Oto przykład: Na podstawie szablonu:
Oparty na modelu:
Szablon:
źródło
Oto moja wersja, której użyłem, aby upewnić się, że wiek w jednej dziedzinie jest większy lub równy wiekowi w innej dziedzinie. Używam również grup formularzy, więc używam
group.get
raczej funkcji niżgroup.controls[]
A w komponencie:
źródło
Myślę, że najlepszym rozwiązaniem na razie jest utworzenie grupy, która będzie sprawować kontrolę. Podczas tworzenia wystąpienia przepustki Control w funkcji, aby ją zweryfikować. przykład:
Wiem, że jest to wysoce zależne od używanej wersji angularjs2. Zostało to przetestowane pod kątem wersji 2.0.0-alpha.46
Jeśli ktoś ma lepsze sugestie, takie jak napisanie własnego walidatora (co może być najlepszym rozwiązaniem), jest mile widziane.
EDYTOWAĆ
możesz także użyć ControlGroup i w pełni zweryfikować tę grupę.
Po prostu edytuj wiadomości zgodnie ze swoją domeną.
źródło
Odpowiedź Louisa Cruza była dla mnie bardzo pomocna.
Aby zakończyć, po prostu dodaj do else reset setErrors: return passwordConfirmationInput.setErrors (null);
I wszystko działa dobrze!
Dzięki Ci,
Pozdrowienia,
TGA
źródło
Angular 8 Przykład sprawdzania poprawności w polu potwierdzenia hasła
FYI: to nie zaktualizuje walidacji w polu passwordConfirm, jeśli główne pole "hasło" zostanie zmienione po tym, jak ta walidacja przeszła. Możesz jednak unieważnić pole potwierdzenia hasła, gdy użytkownik wpisze w pole hasła
register.component.ts
password-confirm-validator.ts
register.component.html
źródło
Proponuję skorzystać z biblioteki
ng-form-rules
. Jest to niesamowita biblioteka do tworzenia wszelkiego rodzaju formularzy z logiką walidacji oddzieloną od komponentu, która może zależeć od zmian wartości w innych obszarach formularza. Mają świetną dokumentację , przykłady i film, który pokazuje kilka jego funkcji . Wykonywanie takiej weryfikacji, co próbujesz zrobić, jest trywialne.Możesz sprawdzić ich README, aby uzyskać informacje na wysokim poziomie i podstawowy przykład.
źródło
Hasło w Angular 4 jest zgodne z regułami weryfikacji.
Jeśli potrzebujesz błędów kontrolnych pól, możesz to zrobić.
Następnie musisz zadeklarować tę metodę w
constructor
metodzie Like as.Zamiast ustawiać błąd w ControlGroup, zrób to na rzeczywistym polu w następujący sposób:
Część HTML dotycząca grupy haseł
źródło