Mam formularz, który jeśli pole wyboru jest fałszywe, wymusza walidację danych wejściowych za pomocą dyrektywy ng-required. Jeśli pole wyboru ma wartość true, pole jest ukryte, a wartość ng-required ma wartość false.
Problem polega na tym, że mam również wyrażenie regularne do walidacji określone na wejściu, a także wykorzystuję dyrektywę kątową ng-pattern. Problem, z którym się spotykam, polega na tym, że jeśli użytkownik poda nieprawidłowy numer telefonu, zaznacza pole, aby dezaktywować dane wejściowe (i nie wymaga dalszej weryfikacji), formularz nie pozwoli na przesłanie, ponieważ jest nieprawidłowy w oparciu o wzorzec ng.
Próbowałem rozwiązać ten problem, dodając funkcję ng-change, aby ustawić model wejściowy na null, jednak wzorzec ng, a tym samym pole, jest nadal ustawiony jako nieprawidłowy w początkowym zestawie pola wyboru na wartość false. Jeśli jednak odznaczę to pole, ustawiając wszystko z powrotem na początkowe ładowanie formularza, a następnie zaznaczam to pole ponownie, formularz jest ważny i można go przesłać. Nie jestem pewien, czego mi brakuje. Oto kod zmiany ng, który mam do tej pory:
var phoneNumberRegex = /^\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})$/;
$scope.phoneNumberPattern = phoneNumberRegex;
$scope.removeValidation = function() {
if ($scope.cell._newUser === false) {
$scope.request._number = '';
$scope.phoneNumberPattern = /[0-9a-zA-Z]?/;
} else {
$scope.phoneNumberPattern = phoneNumberRegex;
}
};
test
metodę. Dlatego nadajemy mu obiekt z naszym własnym niestandardowymtest()
, zasadniczo emulującym natywny JSRegExp
. 2)value
Jest oczywiście przekazywany przez Angular podczas wykonywania faktycznej kontroli ważności.Nie zabierając niczego ze wspaniałej odpowiedzi Nikosa, być może możesz to zrobić prościej:
<form name="telForm"> <input name="cb" type='checkbox' data-ng-modal='requireTel'> <input name="tel" type="text" ng-model="..." ng-if='requireTel' ng-pattern="phoneNumberPattern" required/> <button type="submit" ng-disabled="telForm.$invalid || telForm.$pristine">Submit</button> </form>
Zwróć uwagę na drugie wejście: możemy użyć
ng-if
do sterowania renderowaniem i walidacją w formularzach. JeślirequireTel
zmienna nie jest ustawiona, drugie wejście byłoby nie tylko ukryte, ale w ogóle nie renderowane, więc formularz przejdzie walidację, a przycisk zostanie włączony, a otrzymasz to, czego potrzebujesz.źródło
Zastosowany wzór:
ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"
Używany plik referencyjny:
'<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>'
Przykład wprowadzenia:
<input type="number" require ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"><input type="submit">
źródło
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
<input type="number" require ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"><input type="submit">
źródło
Niedawno wpadłem na to.
To, co zrobiłem, co wydaje się łatwiejsze niż powyższe, to ustawienie wzorca na zmiennej w zakresie i odniesienie się do niego we wzorze ng w widoku.
Kiedy „pole wyboru nie jest zaznaczone”, po prostu ustawiam wartość wyrażenia regularnego na /.*/ w wywołaniu zwrotnym onChanged (jeśli nie jest zaznaczone). ng-pattern wybiera zmianę i mówi „OK, wartość jest dobra”. Formularz jest teraz ważny. Usunąłbym również złe dane z pola, abyś nie miał tam widocznie złego telefonu #.
Miałem dodatkowe problemy związane z ng-required i zrobiłem to samo. Działał jak urok.
źródło
Wygląda na to, że najczęściej głosowana odpowiedź w tym pytaniu powinna zostać zaktualizowana, ponieważ kiedy ją spróbuję, nie stosuje ona
test
funkcji, a walidacja nie działa.Przykład z dokumentów Angular działa dobrze dla mnie:
Modyfikowanie wbudowanych walidatorów
html
<form name="form" class="css-form" novalidate> <div> Overwritten Email: <input type="email" ng-model="myEmail" overwrite-email name="overwrittenEmail" /> <span ng-show="form.overwrittenEmail.$error.email">This email format is invalid!</span><br> Model: {{myEmail}} </div> </form>
js
var app = angular.module('form-example-modify-validators', []); app.directive('overwriteEmail', function() { var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i; return { require: 'ngModel', restrict: '', link: function(scope, elm, attrs, ctrl) { // only apply the validator if ngModel is present and Angular has added the email validator if (ctrl && ctrl.$validators.email) { // this will overwrite the default Angular email validator ctrl.$validators.email = function(modelValue) { return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue); }; } } }; });
Plunker
źródło
Możesz skorzystać ze strony https://regex101.com/, aby stworzyć własny wzorzec dla danego kraju:
Na przykład Polska:
-pattern = xxxxxxxxx OR xxx-xxx-xxx OR xxx xxx xxx -regexp ="^\d{9}|^\d{3}-\d{3}-\d{3}|^\d{3}\s\d{3}\s\d{3}"
źródło