2013-08-08 15 views
9

Czy istnieje sposób sprawdzania poprawności pola w kancie bez użycia dyrektywy? Na przykład: chcę dokonać sprawdzania poprawności w polu wprowadzania.Zatwierdzanie formularza/pola Angularjs przy użyciu funkcji JavaScript bez dyrektyw

  • Jeśli pole jest puste, powinien pojawić się komunikat "Pole musi zawierać wartość".
  • jeśli pole zawiera alfa Znaki liczbowe powinny być wyświetlane "Pole może zawierać tylko cyfry".
  • Liczba EVEN - wiadomość do użytkownika "Wartość musi być liczbą parzystą".

Chcę dokonać następującej walidacji w wywołaniu funkcji JavaScript.

Przeszukałem i zobaczyłem, że istnieje sposób na użycie błędu ng-valid i $, jednak nie udało mi się go uruchomić.

Kod poniżej jest według jednej z odpowiedzi dostałem:

<div ng-app> 
<form name='theForm' novalidate> 
    <input type='text' name='theText' ng-model='theText' ng-pattern='/^[0-9]+$/'/> 
    <span ng-show='theForm.theText.$error.pattern'>Field can contain only digits</span> 
    <span ng-show='theText.length<1'>Field must contain a value</span> 
    <span ng-show='theText%2!=0&&document.getElementsByName("theText").value!=""&&!theForm.theText.$error.pattern&&!theForm.theText.$pristine'>Value must be an even number</span> 
    <br/><input type='submit' value='Submit' /> 
</form> 

chcę wziąć to, co wewnątrz ostatniego [rozpiętości] i umieścić wewnątrz funkcji JavaScript, aby uczynić go bardziej generyczne i ostatecznie zmieniają tylko JS, a nie HTML, gdy zmieniają się warunki

Czy ktoś może doradzić? przykład pracy byłby świetny.

+0

jeśli chcesz zrobić wszystkie te walidacji w funkcji JavaScript, dlaczego nie pójść kątowego sposób i stworzyć dyrektywę zwyczaj sprawdzania poprawności? –

+0

Dlaczego chcesz używać funkcji JavaScript? Angular może to zrobić podczas oglądania modeli takich jak tutaj: http://jsfiddle.net/DotDotDot/6UJZk/1/, używanie innej funkcji nie byłoby tak wydajne Myślę, że – DotDotDot

Odpowiedz

19

Jestem zaskoczony nikt nie wspomniał ui-validate

$scope.isOdd = function($value){ 
    return $value % 2; 
} 
... 
<form name="myform"> 
    <input ng-model="myVal" name="value" required 
    ng-pattern="/^[0-9]*$/" ui-validate=" 'isOdd($value)' "></input> 
    <pre>{{myform.value.$error|json}}</pre> 
</form> 

Nie było prostsze, że i to jest walidacja PROPER angularjs (nie głupie zegarki)

Here's a working demo

+1

to jest dokładnie to, czego szukałem, dzięki. Czy możesz dodać działający przykład? ** Nie mogłem sprawić, aby Twój przykład zadziałał ** – Scription

+1

@Spis dodany. Wygląda na to, że głupia rzecz wymaga * formy * do działania. Nie zapomnij modułu "ui.validate" – ProLoser

3

Zapoznaj się z dokumentacją formularza angularjs - http://docs.angularjs.org/guide/forms. Zasadniczo jest on oparty na atrybutach HTML5, takich jak wymagany, min, max, itp.

Aby uzyskać na przykład pierwsze wykonane zadanie - "puste pole powinno być wyświetlane" Wiadomość musi zawierać wartość ", yo . uwould zrobić coś takiego:

<input type="text" ng-model="user.name" name="uName" required /><br /> 
<div ng-show="form.uName.$invalid"> 
    <span ng-show="form.uName.$error.required">Field must contain a value.</span> 
</div> 

Dla cyfr tylko pola można użyć atrybutu pattern z dopasowania wyrażenia regularnego (przykład: http://www.wufoo.com/html5/attributes/10-pattern.html)

Dla jeszcze walidacji liczb, nie jestem pewien - ja myślę, że musisz przejść do tego z niestandardową walidacją (co oznacza, że ​​musisz stworzyć dyrektywę) lub użyć pattern jakoś.

Last but not least - pamiętaj, aby dodać novalidate do tagu <form>. W przeciwnym razie przeglądarka spróbuje zweryfikować również swoje pola i nie chcesz, aby:

<form ... novalidate> 
... 
</form> 
+0

Odpowiedziałeś na moje q tylko w odniesieniu do atrybutu "require". Co do reszty, może nie sprawiłem, że mój Q był wystarczająco jasny, chcę użyć funkcji JavaScript, która spowodowałaby poprawną walidację każdego klawisza użytkownika, naciśnij na pole (lub opuścił pole). – Scription

+0

Napisałem, co należy zrobić dla cyfry, a nawet walidacja numerów - w przypadku cyfr można użyć atrybutu wzorca (nie ma potrzeby stosowania niestandardowej funkcji JS). Jeśli chodzi o walidację numerów parzystych, jest to trudniejsze i nie sądzę, że będziesz w stanie uciec bez dyrektywy. –

+0

Nie chcę używać dyrektywy w ogóle TYLKO JS – Scription

2

Cóż można spróbować utworzyć func

<span ng-show='isEven(theText)'>Value must be an even number</span> 

$scope.isEven=function(data) { 
    if(data) { 
     return data%2===0 
    } 
    return true; 
} 

Metoda może być albo określona na prąd zasięg kontrolera lub $ rootScope.

Niezbyt kanciasty sposób, ponieważ dyrektywy byłyby lepsze, ale myślę, że zadziała.

+0

Chcę używać JavaScriptu i móc go zmienić zamiast zmieniać HTML. jeśli jednak dyrektywa jest metodą "kątową", to chętnie ją rozważę. ** Czy możesz podać mi przykład zastosowania go w dyrektywie? ** – Scription

+0

Jeśli spojrzysz na kątowy przewodnik dla programistów dla formularzy i sprawdzisz sekcję 'custom validation', zobaczysz działający przykład http://docs.angularjs.org/guide/forms – Chandermani

3

wiem pytanie jest stare i wiem, że nie chciałaś dyrektywy, ale możesz rozważyć zastosowanie dyrektywy, jeśli jest to metoda "kątowa" ... Tutaj jest moja Angular-Validation. Zrobiłem projekt na Githubie i myślę, że to po prostu skaluje się w porównaniu do tego, co jest/było dostępne ... Oparłem się na doskonałej strukturze PHP Laravel i udostępniłem ją pod Angular ... To jest tak szalone proste, potrzebujesz 2 linie 1 linia kodu, 1 linia dla wejścia, 1 linia do wyświetlania błędów, to wszystko ... nigdy więcej i nigdy mniej !!! Dość powiedzieć, dajmy kilka przykładów:

<!-- example 1 --> 
<label for="input1">Email</label> 
<input type="text" validation="email|min_len:3|max_len:25|required" ng-model="form1.input1" name="input1" /> 

<!-- example 2 --> 
<label for="input2">Alphanumeric + Exact(3) + required</label> 
<input type="text" validation="alpha|exact_len:3|required" ng-model="form1.input2" name="input2" /> 

Tak można zdefiniować niezależnie od ilości reguł walidacji (już 25+ typ zatwierdzającym), które chcę w prosty dyrektywy validation="min_len:2|max_len:10|required|integer" i komunikat błędu będzie zawsze wyświetlenia w następnym <span> Nie podoba ci się to już? 1 linia kodu dla twojego wejścia, 1 linia kodu dla wyświetlania błędu, nie możesz być prostszy niż ... oh i nawet wspieram twój Regex, jeśli chcesz dodać. Kolejny bonus, obsługuję również dowolne zdarzenie wyzwalające, najczęściej są to: onblur i onkeyup. Och i ja również obsługuję wiele języków lokalizacji za pośrednictwem zewnętrznych plików JSON. Naprawdę dodałem wszystkie wyobrażalne funkcje, które chciałem do jednej zwariowanej prostej dyrektywy.
Koniec klastra Formularz z 10 liniami kodu dla 1 wejścia (przykro, ale zawsze okazało się, że trochę ekstremalnie), gdy jedyne czego potrzebujesz to 2 linie, nie więcej, nawet dla wejścia z 5 weryfikatorami na nim. I nie martw się, że forma nie stała się nieważna, ja też się tym zajmuję, wszystko to jest obsługiwane w dobry sposób "Angular".

Spójrz na mojego projektu GitHub Angular-Validation ... Jestem pewien, że pokochasz go =)

UPDATE
Kolejnym bonusem cukierki! Aby jeszcze bardziej ułatwić użytkownikowi pracę, dodałem walidację timera. Koncepcja jest prosta, nie zawracaj sobie głowy użytkownikiem podczas pisania, ale sprawdzaj, czy robi pauzę lub zmienia dane wejściowe (onBlur) ... Uwielbiam to !!!
Można nawet dostosować zegar zgodnie z własnymi upodobaniami, postanowiłem ustawić go na 1 sekundę w ramach dyrektywy, ale jeśli chcesz dostosować, możesz zadzwonić na przykład jako typing-limit="5000", aby uzyskać 5 sekund. koniec czasu. Pełny przykład:

<input type="text" ng-model="form1.input1" typing-limit="5000" validation="integer|required" name="input1" /> 
<span class="validation text-danger"></span> 


UPDATE # 2
Dodano także mecz wejście walidacji potwierdzenia (np .: potwierdzenie hasła), oto przykładowy kod

<!-- input match confirmation, as for example: password confirmation --> 
<label for="input4">Password</label> 
<input type="password" name="input4" ng-model="form1.input4" validation="alpha|min_len:4|required" /> 
<label for="input4c">Password Confirmation</label> 
<input type="password" name="input4c" ng-model="form1.input4c" validation="match:form1.input4,Password|required" /> 

Aktualizacja # 3
Uregułowano dyrektywę tak, że wymóg posiadania <span> do wyś wietlania błę du jest zbę dny, dyrektywa obsługuje teraz samodzielnie, zobacz co de zmiana odzwierciedlona na górze.

DEMO
Dodany live demo na Plunker

+0

Dzięki za wysiłek i wtyczkę – Scription

+0

Nie ma za co, wielu ludzi by go użyło i pomogło ulepszyć ... proszę, poprawiłem dzisiaj błąd, który być może po wypróbowaniu tego, upewnij się, że korzystasz z najnowszego kodu ... Dzięki ... i jestem ciekawy, czy mógłbyś go użyć? Czy podoba ci się ta koncepcja? – ghiscoding

+0

@griscoding Jestem ciekawa, dlaczego uważasz, że to podejście jest lepsze niż użycie ''? Sądzę, że wszystkie przypadki użycia, które prezentują ci projekty, mogą być objęte tymi trzema atrybutami. – ProLoser

Powiązane problemy