Angularjs 동적 ng- 패턴 유효성 검사


84

확인란이 거짓이면 ng-required 지시문을 사용하여 텍스트 입력에 대한 유효성 검사를 시행하는 양식이 있습니다. 확인란이 true이면 필드가 숨겨지고 ng-required가 false로 설정됩니다.

문제는 또한 ng-pattern 각도 지시문을 활용하여 입력에 지정된 유효성 검사를위한 정규식이 있다는 것입니다. 내가 겪고있는 문제는 사용자가 잘못된 전화 번호를 입력하고 해당 입력을 비활성화하는 확인란을 선택하면 (결과적으로 추가 유효성 검사가 필요하지 않음) 양식이 ng 패턴을 기반으로 유효하지 않기 때문에 제출을 허용하지 않는다는 것입니다.

입력 모델을 null로 설정하는 ng-change 함수를 추가하여이 문제를 해결하려고 시도했지만 ng-pattern 및 따라서 필드는 확인란의 초기 설정에서 여전히 유효하지 않은 것으로 설정되어 있습니다. 그러나 상자를 선택 취소하고 모든 것을 초기 양식로드로 설정 한 다음 상자를 다시 선택하면 양식이 유효하고 제출할 수 있습니다. 내가 무엇을 놓치고 있는지 잘 모르겠습니다. 지금까지 내가 가지고있는 ng-change 코드는 다음과 같습니다.

    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;
        }
    };

답변:


175

이것은 흥미로운 문제입니다. 복잡한 Angular 유효성 검사입니다. 다음 바이올린은 원하는 것을 구현합니다.

http://jsfiddle.net/2G8gA/1/

세부

나는 새로운 지침 작성, rpattern각도의의 혼합이다, ng-requiredng-pattern에서 코드를 input[type=text]. 그것이하는 일은 required필드 의 속성을 관찰하고 regexp로 검증 할 때이를 고려하는 것입니다. 즉, 필수가 아닌 경우 필드를 valid-pattern.

메모

  • 대부분의 코드는 Angular에서 가져 왔으며 이에 맞게 조정되었습니다.
  • 확인란을 선택하면 필드가 필요합니다.
  • 필수 확인란이 false이면 필드가 숨겨지지 않습니다.
  • 데모에서는 정규식이 단순화되었습니다 (유효한 3 자리).

더러운 새 지침을 원하지 않는 경우 (그러나 작은) 솔루션은 다음과 같을 것이다 :

$scope.phoneNumberPattern = (function() {
    var regexp = /^\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})$/;
    return {
        test: function(value) {
            if( $scope.requireTel === false ) {
                return true;
            }
            return regexp.test(value);
        }
    };
})();

그리고 HTML에서는 변경이 필요하지 않습니다.

<input type="text" ng-model="..." ng-required="requireTel"
    ng-pattern="phoneNumberPattern" />

이 사실은 전화로 각 트릭 우리의 test() 방법을 대신 RegExp.test()소요 required계정으로.


2
함수를 둘러싼 둥근 괄호가 무엇을하는지 알고 싶습니다. 그들 없이는 작동하지 않습니다
NeedHack 2014-06-03

5
함수를 직접 호출하여 반환 값을 변수에 효과적으로 배치합니다. 특정 구성 요소의 구현 세부 사항으로 외부 범위를 오염시키지 않기 위해 Javascript에서 매우 일반적입니다 (예 : 모듈 패턴 살펴보기) .
Nikos Paraskevopoulos

6
JS의 "ducktyping"을 기반으로 AngularJS에서 트릭을 실행하는 더러운 솔루션은 내가 오늘 본 코드 중 가장 멋진 코드입니다. 정말 영리한 솔루션!
Florian Loch

멋진 코드에 감사하지만 아직 명확하지는 않습니다. 1) docs.angularjs.org/api/ng/directive/input 에 따르면 "표현식이 RegExp 객체로 평가되면 직접 사용됩니다. 문자열로 변환하면 RegExp로 변환됩니다. "하지만 반환 할 때 phoneNumberPattern이 객체라고 가정합니다. Regxp Obj 여야합니까? 2) 그리고 test의 function (value) {} 저장소에서 매개 변수 "value"는 어디에서 왔습니까? 모든 답변에 감사드립니다!
user2499325

1
1) "표현식이 RegExp로 평가되는 경우"절은 획득 한 것에 test메소드 가 있는지 확인하여 Angular에 의해 구현됩니다 . 이것이 우리가 test()기본적으로 네이티브 JS를 에뮬레이트하는 자체 사용자 정의로 객체를 제공하는 이유 RegExp입니다. 2) value물론 실제 유효성 검사를 수행 할 때 Angular에 의해 전달됩니다.
Nikos Paraskevopoulos

25

Nikos의 굉장한 대답에서 아무것도 빼앗지 않고 아마도 이것을 더 간단하게 할 수 있습니다.

<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>

두 번째 입력에주의하십시오.를 사용하여 ng-if양식의 렌더링 및 유효성 검사를 제어 할 수 있습니다 . 경우 requireTel변수가 설정되지, 두 번째 입력은 숨길 수 없습니다 만, 전혀 렌더링되지 것입니다, 따라서 양식 유효성 검사를 통과하고 버튼이 활성화 될 것입니다, 당신은 당신이 필요로하는 것을 얻을 수 있습니다.


1
장점은 간단합니다. 단점은 ng-if 표현식이 false 일 때 제거되는 모든 입력은 ng-if가 나중에 true로 평가되면 제거 된 모든 텍스트를 포함한다는 것입니다. 단순함을 위해 +1합니다.
Brad

이 경로로 이동하면 ng-if (예를 들어 div에 넣는 경우) 내의 모든 것이 이제 자체 범위를 갖게된다는 것을 이해했는지 확인하고 싶습니다.
Brad

5

사용 된 패턴 :

 ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"

사용 된 참조 파일 :

 '<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">

2

 <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">


2

나는 요 전에 이것을 만났다.

위보다 쉬운 것처럼 보이는 것은 스코프의 변수에 패턴을 설정하고 뷰에서 ng-pattern으로 참조하는 것입니다.

"체크 박스가 선택 해제 된 경우"onChanged 콜백에서 정규식 값을 /.*/로 설정하기 만하면됩니다 (선택하지 않은 경우). ng-pattern은 변경되는 항목을 선택하고 "OK, your value is fine"이라고 말합니다. 이제 양식이 유효합니다. 나는 또한 현장에서 잘못된 데이터를 제거하여 거기에 앉아있는 명백한 불량 전화가 없도록합니다.

나는 ng-required와 관련된 추가 문제가 있었고 같은 일을했습니다. 매력처럼 작동했습니다.


0

ngModel $ viewValue가 속성 값에 주어진 Angular 표현식을 평가하여 찾은 RegExp와 일치하지 않는 경우 패턴 유효성 검사 오류 키를 설정합니다. 표현식이 RegExp 객체로 평가되면 직접 사용됩니다. 표현식이 문자열로 평가되면 ^ 및 $ 문자로 래핑 한 후 RegExp로 변환됩니다.

이 질문에서 가장 많이 투표 한 답변은 업데이트해야하는 것 같습니다. 시도 할 때 test기능이 적용되지 않고 유효성 검사가 작동 하지 않기 때문 입니다.

에서 예 각도 문서는 나를 위해 잘 작동합니다 :

내장 유효성 검사기 수정

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);
                };
             }
         }
     };
 });

플 런커


-1

https://regex101.com/ 사이트를 사용 하여 일부 국가에 대한 고유 한 패턴을 구축 할 수 있습니다 .

예 : 폴란드 :

-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}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.