• 技术文章 >php教程 >PHP开发

    基于angularJS的表单验证指令介绍

    高洛峰高洛峰2016-12-09 14:12:30原创593
    做开发这么久一直被表单验证这个看似简单又不简单的东西搞得非常烦躁,于是写了个表单验证的框架,再也不用担心这个心烦的验证了。

    这里使用AngularJS的指令进行处理代码及其简洁明了

    下面是指令JS代码

    app.directive('ccForm',['$parse',function ($parse) {
      return {
        restrict:'A',
        link:function (scope,element,attrs) {
          var first=true;
          var errors=0;
          var checkInterval;
          function showError(input,errorIndex) {
            if(first){
              errors++;
              $parse(element.attr('cc-form')).assign(scope,false);
              refreshScope(scope);
              return;
            }
            input.addClass('hasError');
            input.closest('.form-group').addClass('hasError');
            input.next('.help-block').find('.cc-show').removeClass('cc-show');
            input.next('.help-block').find('[cc-error-'+errorIndex+']').addClass('cc-show');
            input.closest('.form-group').next('.help-block').find('.cc-show').removeClass('cc-show');
            input.closest('.form-group').next('.help-block').find('[cc-error-'+errorIndex+']').addClass('cc-show');
          }
          function hidError(input,errorIndex) {
            errors--;
            if(errors==0){
              $parse(element.attr('cc-form')).assign(scope,true);
              refreshScope(scope);
            }
            input.removeClass('hasError');
            input.closest('.form-group').removeClass('hasError');
            input.next('.help-block').find('[cc-error-'+errorIndex+']').removeClass('cc-show');
            input.closest('.form-group').next('.help-block').find('[cc-error-'+errorIndex+']').removeClass('cc-show');
          }
          function checkInput(input) {
            var that=$(input);
            // $('[cc-email]')[0].attributes[0].name
            var attrs=input.attributes;
            var value=that.val();
            for(var i=0,attr;attr=attrs[i];i++){
              if(attr.name=='cc-email'){
                if(/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(value)){
                  hidError(that,attr.value)
                }else{
                  showError(that,attr.value);
                  break;
                }
              }else if(attr.name=='cc-phone'){
                if(/\d{11}/.test(value)){
                  hidError(that,attr.value);
                }else {
                  showError(that,attr.value);
                  break;
                }
              }else if(attr.name=='cc-max'){
                if(value.length>attr.value){
                  showError(that,that.attr(attr.name+'-error'));
                  break;
                }else {
                  hidError(that,that.attr(attr.name+'-error'));
                }
              }else if(attr.name=='cc-min'){
                if(value.length<attr.value){
                  showError(that,that.attr(attr.name+'-error'));
                  break;
                }else {
                  hidError(that,that.attr(attr.name+'-error'));
                }
              }else if(attr.name=='cc-regex'){
                var patten=new RegExp(attr.value);
                if(patten.test(value)){
                  hidError(that,that.attr(attr.name+'-error'));
                }else {
                  showError(that,that.attr(attr.name+'-error'));
                  break;
                }
              }else if(attr.name=='cc-require'){
                if(!value||value.trim()==''){
                  showError(that,attr.value);
                  break;
                }else {
                  hidError(that,attr.value);
                }
              }
            }
          }
          function checkForm(form) {
            form.find('input,textarea').each(function () {
              checkInput(this);
            });
          }
          element.find('input,textarea').focus(function (e) {
            var that=this;
            first=false;
            checkInterval=setInterval(function () {
              checkInput(that);
            },500);
          });
          element.find('input,textarea').blur(function (e) {
            first=false;
            checkInput(this);
            clearInterval(checkInterval);
          });
          element.find('[cc-submit]').click(function (e) {
            first=false;
            clearInterval(checkInterval);
            checkForm(element);
          });
          //预检测时不显示错误提示
          checkForm(element);
        }
      }
    }]);

    对应的需要一点点CSS代码,下面是用LESS写的

    .help-block {
     * {
      &:not(.cc-show) {
       display: none;
      }
     }
    }

    对应的CSS就是

    .help-block *:not(.cc-show) {
      display: none;
    }

    用法1

    <div>
      <h1>test</h1>
      <form cc-form="form1">
        <div class="from-group">
          <input type="password" ng-model="user.password" cc-max="16" cc-max-error="1" cc-min="6" cc-min-error="2">
          <div class="help-block">
            <p cc-error-1>密码长度不能超过16位</p>
            <p cc-error-2>密码最短为6</p>
          </div>
        </div>
        <div class="form-group">
          <input ng-model="user.phone" cc-regex="\d{11}" cc-regex-error="1">
          <div class="help-block">
            <p cc-error-1>请输入正确的手机号</p>
          </div>
        </div>
        <div class="form-group">
          <input ng-model="user.fax" cc-require="1">
          <div class="help-block">
            <p cc-error-1>请输入传真</p>
          </div>
        </div>
        <div class="form-group">
          <input ng-model="user.email" cc-email="1">
          <div class="help-block">
            <p cc-error-1>请输入正确的邮箱</p>
          </div>
        </div>
        <button type="button" cc-submit>提交</button>
      </form>
    </div>

    用法2

    <form class="form shadow-box" cc-form="form1">
      <h3>登录</h3>
      <div class="form-group">
        <div class="cellphone">
          <input placeholder="手机号" ng-model="user.loginName" name="loginName" cc-regex="\d{11}" cc-regex-error="1" cc-require="2"/>
        </div>
      </div>
      <div class="help-block">
        <p cc-error-1>请输入正确的手机号</p>
        <p cc-error-2>请输入手机号</p>
      </div>
      <div class="form-group">
        <div class="password">
          <input placeholder="密码" type="password" ng-model="user.password" name="password" cc-require="1"/>
        </div>
      </div>
      <div class="help-block">
        <p cc-error-1>请输入密码</p>
      </div>
      <div class="form-group">
        <div class="vcode">
          <input placeholder="验证码" ng-model="user.vcode" name="vcode" cc-require="1">
          <img src="">
        </div>
      </div>
      <div class="help-block">
        <p cc-error-1>请输入验证码</p>
      </div>
      <div class="checkbox">
        <label>
          <input type="checkbox" ng-model="user.rememberPass" ng-true-value="true" ng-false-value="false">自动登录
        </label>
      </div>
      <p class="to-register">没有账号?<a href="#/main/register">立即注册</a></p>
      <button type="button" ng-click="login(1)" cc-submit>登录</button>
    </form>

    如此简洁明了

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:angularJS
    上一篇:浅谈angularjs module返回对象的坑 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 深入理解jQuery.data() 的实现方式• 基于jQuery实现Tabs选项卡自定义插件• jQuery选择器总结• 另类操作dedecms 文章的审核状态• 缓存技术详谈—php
    1/1

    PHP中文网