Angularjs使用指令做表单校验的方法


Posted in Javascript onMarch 31, 2017

前言

通常,使用angular做表单验证,一般都是把验证规则单独写为service,然后通过依赖注入的方式调用。在个别情况下,例如用户注册表单,需要根据用户输入给出不同提示信息,使用service略显不合适宜,所以可以采用指令的方式。

简易表单

如下为一个简易表单,有四项提示信息,依据状态呈现。校验规则为数字,大写字母,小写字母至少出现两项,通过正则配合ng-pattern能够实现相同的效果,此处仅为引入指令校验,不做深究。其中,user-validator为自定义指令。

<form class="form-horizontal" name="form" role="form" ng-controller="ValidCtrl">
 <div class="form-group">
  <label for="user" class="col-sm-2 control-label" >用户名</label>
  <div class="col-sm-5">
   <input type="text" ng-model="user" name="user" id="user" user-validator class="form-control" required="required">
  </div>
  <label class="col-sm-5" ng-show="form.user.$pristine">请输入用户名</label>
  <label class="col-sm-5" ng-show="form.user.$error.required && form.user.$dirty">
   用户名不能为空
  </label>
  <label class="col-sm-5" ng-show="form.user.$error.defined && form.user.$dirty">
   用户名不符合规则
  </label>
  <label class="col-sm-5" ng-show="form.user.$valid && form.user.$dirty">
   用户名有效
  </label>
 </div>
</form>

校验指令

校验指令代码如下:

angular.module('shuffleApp', [])
 .directive('userValidator', ['$log', function($log) {
   return {
     restrict: 'A',
     require: 'ngModel',
     link: function($scope, $element, $attrs, $ngModelCtrl) {
       var verifyRule = [/^\d+$/, /^[a-z]+$/, /^[A-Z]+$/];
       var verify = function(input) {
         return !(verifyRule[0].test(input) || 
              verifyRule[1].test(input) || 
              verifyRule[2].test(input));
       };
       $ngModelCtrl.$parsers.push(function(input) {
         var validity = verify(input);
         $ngModelCtrl.$setValidity('defined', validity);
         return validity ? input : false;
       });
       $ngModelCtrl.$formatters.push(function(input) {
         var validity = verify(input);
         $ngModelCtrl.$setValidity('defined', validity);
         return validity ? input : false;
       })
     }
   }
  }]);

指令内容非常简单,检测是否全为数字,小写字母,大写字母,然后取反即得到校验结果。然后在$parser, $formatter内部设置校验结果即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS中for循序中延迟加载动态效果的具体实现
Aug 18 Javascript
js setTimeout()函数介绍及应用以倒计时为例
Dec 12 Javascript
jQuery中(function($){})(jQuery)详解
Jul 15 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
js和jquery分别验证单选框、复选框、下拉框
Dec 17 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
Mar 18 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 Javascript
JavaScript实现星级评分
Jan 12 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
Vue2.0 实现歌手列表滚动及右侧快速入口功能
Aug 08 Javascript
JS正则获取HTML元素的方法
Mar 31 #Javascript
JS+CSS实现下拉刷新/上拉加载插件
Mar 31 #Javascript
ES6中Generator与异步操作实例分析
Mar 31 #Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 #Javascript
ES6中Iterator与for..of..遍历用法分析
Mar 31 #Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 #Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
Mar 31 #Javascript
You might like
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
Python Pillow Image Invert
2019/01/22 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
安全生产活动月方案
2014/03/09 职场文书
学期评语大全
2014/04/30 职场文书
大学班级文化建设方案
2014/05/06 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
二十年同学聚会感言
2015/07/30 职场文书