Mam formularz z polami wejściowymi i konfiguracją sprawdzania poprawności, dodając required
atrybuty i takie. Ale w przypadku niektórych pól muszę przeprowadzić dodatkową weryfikację. Jak miałbym „włączyć się” do FormController
kontroli, która kontroluje?
Weryfikacja niestandardowa może wyglądać tak: „jeśli te 3 pola są wypełnione, to pole jest wymagane i musi zostać sformatowane w określony sposób”.
Jest metoda, FormController.$setValidity
ale to nie wygląda na publiczny interfejs API, więc raczej go nie używam. Tworzenie niestandardowej dyrektywy i korzystanie z niej NgModelController
wygląda jak inna opcja, ale zasadniczo wymagałoby ode mnie utworzenia dyrektywy dla każdej niestandardowej reguły sprawdzania poprawności, czego nie chcę.
Właściwie oznaczenie pola z kontrolera jako niepoprawnego (przy jednoczesnym utrzymaniu FormController
synchronizacji) może być rzeczą, której potrzebuję w najprostszym scenariuszu, aby wykonać zadanie, ale nie wiem, jak to zrobić.
formName.$warning
.$$
poprzedza niepubliczne apis,$
będąc publicznym. Zobacz stackoverflow.com/questions/19338493/…Odpowiedzi:
Edycja: dodano informacje o ngMessages (> = 1.3.X) poniżej.
Standardowe komunikaty sprawdzania poprawności formularza (1.0.X i nowsze)
Ponieważ jest to jeden z najlepszych wyników, jeśli Google „Angular Form Validation”, obecnie chcę dodać kolejną odpowiedź na to pytanie dla każdego, kto stamtąd przyjdzie.
To „publiczne”, bez obaw. Użyj tego. Po to jest. Gdyby nie miał być użyty, deweloperzy Angular sprywatyzowaliby go w zamknięciu.
Aby przeprowadzić niestandardową weryfikację, jeśli nie chcesz używać Angular-UI jako drugiej sugerowanej odpowiedzi, możesz po prostu stworzyć własną dyrektywę sprawdzania poprawności.
A oto przykładowe użycie:
Uwaga: w 1.2.x to chyba preferrable zastąpił
ng-if
nang-show
wyżejOto obowiązkowy link plunker
Napisałem też kilka wpisów na blogu na ten temat, który zawiera trochę więcej szczegółów:
Walidacja formy kątowej
Niestandardowe dyrektywy walidacyjne
Edycja: za pomocą ngMessages w 1.3.X
Możesz teraz używać modułu ngMessages zamiast ngShow, aby wyświetlać komunikaty o błędach. W rzeczywistości będzie działać z czymkolwiek, nie musi to być komunikat o błędzie, ale oto podstawy:
<script src="angular-messages.js"></script>
Odniesienie
ngMessages
w deklaracji modułu:Dodaj odpowiedni znacznik:
W powyższym znaczniku w
ng-message="personForm.email.$error"
zasadzie określa kontekst dlang-message
dyrektyw potomnych. Wtedyng-message="required"
ing-message="email"
określić właściwości w tym kontekście do oglądania.Co najważniejsze, określają również kolejność ich zameldowania . Pierwszy, który znajdzie na liście, który jest „prawdomówny”, wygrywa i pokaże tę wiadomość i żaden z pozostałych.I plunker dla przykładu ngMessages
źródło
return value ? valid : undefined
powyżej.Projekt Angular-UI zawiera dyrektywę sprawdzającą poprawność interfejsu użytkownika, która prawdopodobnie Ci w tym pomoże. Pozwala określić funkcję, która ma zostać wywołana w celu sprawdzenia poprawności.
Zajrzyj na stronę demonstracyjną: http://angular-ui.github.com/ , do nagłówka Sprawdź poprawność.
Ze strony demonstracyjnej:
następnie w kontrolerze:
źródło
W scenariuszu sprawdzania poprawności możesz użyć ng-wymagane („jeśli te 3 pola są wypełnione, to pole jest wymagane”):
źródło
Możesz użyć Angular-Validator .
Przykład: użycie funkcji do sprawdzenia poprawności pola
Wtedy w twoim kontrolerze będziesz mieć coś takiego
Możesz także zrobić coś takiego:
(gdzie field1 field2 i field3 są zmiennymi zakresu. Możesz również sprawdzić, czy pola nie są równe pustemu ciągowi)
Jeśli pole nie przejdzie,
validator
pole zostanie oznaczone jako nieprawidłowe i użytkownik nie będzie mógł przesłać formularza.Więcej przypadków użycia i przykładów można znaleźć na stronie : https://github.com/turinggroup/angular-validator
Oświadczenie: Jestem autorem Angular-Validator
źródło
Niedawno stworzyłem dyrektywę, która pozwala na oparte na wyrażeniach unieważnianie danych kątowych. Można użyć dowolnego poprawnego wyrażenia kątowego i obsługuje on niestandardowe klucze sprawdzania poprawności za pomocą notacji obiektowej. Testowany z kątowym v1.3.8
Możesz użyć tego w następujący sposób:
Lub po prostu przekazując wyrażenie (otrzyma domyślny klucz validationKey z „invalidIf”)
źródło
Oto fajny sposób na wykonanie niestandardowej weryfikacji wyrażeń wieloznacznych w formularzu (z: Zaawansowana walidacja formularza za pomocą AngularJS i filtrów ):
Wersja demonstracyjna jsFiddle (obsługuje nazewnictwo wyrażeń i wiele wyrażeń)
Jest podobny do
ui-validate
, ale nie potrzebujesz funkcji sprawdzania poprawności określonego zakresu (działa to ogólnie) i oczywiście nie potrzebujesz w ten sposób pliku ui.utils .źródło
Aktualizacja:
Ulepszona i uproszczona wersja poprzedniej dyrektywy (jedna zamiast dwóch) o tej samej funkcjonalności:
Przykładowe użycie:
Wynik: wzajemnie zależne wyrażenia testowe, w których walidatory są wykonywane po zmianie modelu dyrektywy innego i bieżącego modelu.
Wyrażenie testowe ma
$model
zmienną lokalną , której należy użyć do porównania z innymi zmiennymi.Poprzednio:
Podjąłem próbę ulepszenia kodu @Plantface, dodając dodatkową dyrektywę. Ta dodatkowa dyrektywa jest bardzo przydatna, jeśli nasze wyrażenie musi zostać wykonane, gdy zmiany zostaną wprowadzone w więcej niż jednej zmiennej ngModel.
Przykład użycia go do tworzenia pól walidowanych krzyżowo:
ensure-expression
jest wykonywany w celu sprawdzenia poprawności modelu, gdy zmiennang-model
lubensure-watch
zmienna jest zmienna.źródło
@synergetic Myślę, że @ rozwiążmy przypuszczenie, aby ustawić funkcję sprawdzania poprawności, jak poniżej
źródło
Weryfikacje niestandardowe wywołujące serwer
Użyj interfejsu API ngModelController,
$asyncValidators
który obsługuje asynchroniczne sprawdzanie poprawności, na przykład wysyłanie żądania do wewnętrznej bazy danych$http
. Funkcje dodane do obiektu muszą zwrócić obietnicę, która musi zostać rozwiązana, gdy jest ważna, lub odrzucona, gdy jest niepoprawna. Walidacje asynchroniczne w toku są zapisywane według kluczangModelController.$pending
. Aby uzyskać więcej informacji, zobacz AngularJS Developer Guide - Forms (Custom Validation) .Aby uzyskać więcej informacji, zobacz
ngModelController
$asyncValidators
APIAngularJS Developer Guide - Forms (Custom Validation) .
Korzystanie z
$validators
interfejsu APIZaakceptowana odpowiedź używa potoków
$parsers
i,$formatters
aby dodać niestandardowy walidator synchroniczny. AngularJS 1.3+ dodał$validators
API, więc nie ma potrzeby umieszczania walidatorów w potokach$parsers
i$formatters
:Aby uzyskać więcej informacji, zobacz AngularJS ngModelController API Reference - $ validators .
źródło
W AngularJS najlepszym miejscem do zdefiniowania niestandardowej weryfikacji jest dyrektywa Cutsom. AngularJS zapewnia moduł ngMessages.
Do sprawdzania poprawności formularzy należy używać modułów ngMessages z niestandardową dyrektywą. Tutaj mam prostą weryfikację, która sprawdzi, czy długość numeru jest mniejsza niż 6, wyświetla błąd na ekranie
Oto jak utworzyć niestandardową dyrektywę sprawdzania poprawności
$setValidity
jest wbudowaną funkcją ustawiania stanu modelu na poprawny / nieprawidłowyźródło
Rozszerzyłem odpowiedź @Ben Lesh z możliwością określenia, czy w sprawdzaniu poprawności rozróżniana jest wielkość liter, czy nie (domyślnie)
posługiwać się:
kod:
źródło
Kilka świetnych przykładów i bibliotek prezentowanych w tym wątku, ale nie do końca miały to, czego szukałem. Moje podejście: ważność kątowa - biblioteka sprawdzania poprawności oparta na obietnicach dla sprawdzania poprawności asynchronicznej, z opcjonalnym wbudowanym stylem Bootstrap.
Rozwiązanie sprawdzania poprawności kątowej dla przypadku użycia OP może wyglądać mniej więcej tak:
Oto skrzypce , jeśli chcesz spróbować. Biblioteka jest dostępna na GitHub , ma szczegółową dokumentację i mnóstwo demonstracji na żywo.
źródło