AngularJS 사용자 정의 폼 검증 기능 인 스 턴 스 상세 설명

10705 단어 AngularJS폼 검증
이 사례 는 AngularJS 사용자 정의 폼 검증 기능 을 다 루 었 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
Angular 는 대부분 자주 사용 하 는 HTML 5 폼 컨트롤 의 유형(text,number,url,email,date,radio,checkbox)을 실현 하고 많은 명령 을 검증(required,pattern,minlength,maxlength,min,max)으로 실현 했다.
사용자 정의 명령 에 서 는 ngModelController 의$vaidators 대상 에 인증 방법 을 추가 할 수 있 습 니 다.이 controller 대상 을 얻 기 위해 서 는 requirengModel 명령 이 필요 합 니 다.
$vaidators 대상 의 모든 방법 은 model Value 와 view Value 두 값 을 매개 변수 로 받 습 니 다.바 인 딩 된 인증 방법 이 값(true,false)을 되 돌려 준 후,Angular 는 내부 에서$set Validity 방법 을 호출 합 니 다.인증 은 입력 상자 마다 값 이 바 뀌 거나 모델 의 값 이 바 뀝 니 다.인증 은$parsers 와$formatters 가 성공 적 으로 실 행 된 후에 검증 되 지 않 은 항목 은 ngModelController.$error 의 속성 으로 저 장 됩 니 다.
또한,이 contrller 대상 에$asyncValidators 대상 이 하나 더 있 습 니 다.만약 에 인증 이 비동기 적 이 라면 인증 을 추가 하여 이 대상 에 추가 해 야 합 니 다.예 를 들 어 사용자 가 등록 할 때 핸드폰 번 호 를 입력 해 야 합 니 다.우 리 는 백 엔 드 에서 이 핸드폰 번호 가 등록 되 었 는 지 검증 해 야 합 니 다.이 검증 방법 은 promise 대상 을 반환 해 야 합 니 다.그리고 인증 이 통 과 될 때 지연 대상 의 resolve 를 호출 하고 실패 할 때 reject 를 호출 하 며 완료 되 지 않 은 비동기 인증 은 ngModelController.$pending 에 저 장 됩 니 다.
예 를 들 어(그 중의 user 대상 을 주의 하고 검증 이 통과 되 어야 만 모델 에 값 을 연결 할 수 있 습 니 다):

<form name="register_form" ng-submit="save()">
    <div class="form-group">
        <label for="phoneNumber">
               (    ):
        </label>
        <input type="text" class="form-control" ng-model="user.phoneNumber" id="phoneNumber" name="phoneNumber" required phone>
    </div>
    <div class="form-group">
        <label for="username">
               (      ):
        </label>
        <input type="text" class="form-control" ng-model="user.username" id="username" required username>
    </div>
    <button class="btn btn-block btn-primary" type="submit">  </button>
</form>
<h3>    </h3>
<pre>
    {{ user | json }}
</pre>

'use strict';
angular.module('app', [])
.directive('phone', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$asyncValidators.phone = function (modelValue, viewValue) {
        var d = $q.defer();
        $http.get('phone.json')
        .success(function (phoneList) {
          if (phoneList.indexOf(parseInt(modelValue)) >= 0) {
            d.reject();
          } else {
            d.resolve();
          }
        });
        return d.promise;
      }
    }
  }
})
.directive('username', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$validators.username = function (modelValue, viewValue) {
        if (modelValue) {
          return modelValue.length > 5 ? true : false;
        };
        return false;
      }
    }
  }
})

phone.json

[
  13758262732,
  15658898520,
  13628389818,
  18976176895,
  13518077986
]

효과.

다음 완전한 사용자 등록 폼 인증:
html:

<form name="register_form" novalidate>
    <div class="form-group">
        <label for="username">   :</label>
        <!-- ng-pattern="/PATTERN/"          -->
        <input type="text" id="username" ng-model="user.username" class="form-control" name="username" required ng-pattern="/^[^#]*$/">
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.username.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.username.$error.pattern">
        <strong>   !</strong>
              # 。
    </div>
    <div class="alert alert-danger" ng-show="register_form.username.$error.required && register_form.username.$touched">
        <strong>   !</strong>
               。
    </div>
    <div class="form-group">
        <label for="_password">  :</label>
        <!-- ng-minlength="num"            -->
        <input type="password" id="_password" ng-model="data._password" class="form-control" required ng-minlength="8" name="_password">
        <span class="glyphicon glyphicon-ok right" ng-show="register_form._password.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form._password.$error.minlength && register_form._password.$touched">
        <strong>   !</strong>
                  。
    </div>
    <div class="alert alert-danger" ng-show="register_form._password.$error.required && register_form._password.$touched">
        <strong>   !</strong>
              。
    </div>
    <div class="form-group">
        <label for="password">    :</label>
        <input type="password" id="password" ng-model="user.password" class="form-control" name="password" required pwd-repeat>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.password.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.password.$error.pwdRepeat && register_form.password.$touched">
        <strong>   !</strong>
                  。
    </div>
    <div class="alert alert-danger" ng-show="register_form.password.$error.required && register_form.password.$touched">
        <strong>   !</strong>
               。
    </div>
    <div class="form-group">
        <label for="phone">   :</label>
        <div class="row">
            <div class="col-sm-10">
                <input type="num" id="phone" ng-model="user.phone" name="phone" class="form-control" required ng-minlength="11" ng-maxlength="11" phone>
            </div>
            <div class="col-sm-2">
                <button class="btn btn-default" type="button" ng-disabled="register_form.phone.$invalid">     </button>
            </div>
        </div>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.phone.$valid"></span>
    </div>
    <div class="alert alert-danger" ng-show="register_form.phone.$error.phone">
        <strong>   !</strong>
                ,     。
    </div>
    <div class="alert alert-danger" ng-show="register_form.phone.$touched && !register_form.phone.$error.phone && (register_form.phone.$error.required || register_form.phone.$error.minlength || register_form.phone.$error.maxlength)">
        <strong>   !</strong>
                 。
    </div>
    <div class="form-group">
        <label for="code">   :</label>
        <input type="text" id="code" ng-model="user.code" class="form-control" name="code" required>
        <span class="glyphicon glyphicon-ok right" ng-show="register_form.code.$valid"></span>
    </div>
    <!--               -->
    <button class="btn btn-block btn-primary" type="submit" ng-disabled="register_form.$invalid" ng-click="save()">  </button>
</form>

js:

'use strict';
angular.module('app', [])
.controller('myCtrl', function ($scope) {
  $scope.data = {};
  $scope.save = function () {
    alert('    !')
  }
})
//          
.directive('phone', function ($q, $http) {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$asyncValidators.phone = function (modelValue, viewValue) {
        var d = $q.defer();
        $http.get('phone.json')
        .success(function (phoneList) {
          if (phoneList.indexOf(parseInt(modelValue)) >= 0) {
            d.reject();
          } else {
            d.resolve();
          }
        });
        return d.promise;
      }
    }
  }
})
//                    
.directive('pwdRepeat', function () {
  return {
    require: 'ngModel',
    link: function (scope, ele, attrs, ctrl) {
      ctrl.$validators.pwdRepeat = function (modelValue) {
        //      ,    ,   required
        if (ctrl.$isEmpty(modelValue)) {
          return true;
        }
        return modelValue === scope.data._password ? true : false;
      }
    }
  }
})

css:

.form-group {
  position: relative;
}
.right {
  position: absolute;
  right: 10px;
  top: 34px;
  color: green;
}

phone.json:

[
  13758262732,
  15658898520,
  13628389818,
  18976176895,
  13518077986
]


AngularJS 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,과 을 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 AngularJS 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기