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 相关文章推荐
JQuery插件开发示例代码
Nov 06 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
什么是cookie?js手动创建和存储cookie
May 27 Javascript
JavaScript跨域方法汇总
Oct 16 Javascript
JavaScript严格模式禁用With语句的原因
Oct 20 Javascript
JavaScript操作URL的相关内容集锦
Oct 29 Javascript
使用jquery提交form表单并自定义action的实现代码
May 25 Javascript
jQuery hover事件简单实现同时绑定2个方法
Jun 07 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
Mar 09 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
Jun 13 Javascript
JS运动特效之完美运动框架实例分析
Jan 24 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
php 表单数据的获取代码
2009/03/10 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
用js实现in_array的方法
2013/11/05 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python创建n行m列数组示例
2019/12/02 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
《第一次抱母亲》教学反思
2014/04/16 职场文书
镇创先争优活动总结
2014/08/28 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang
利用Java连接Hadoop进行编程
2022/06/28 Java/Android