AngularJS自动表单验证


Posted in Javascript onFebruary 01, 2016

AngularJS的另外一种表单验证方式是自动验证,即通过directive来实现,除了AngularJS自带的directive,还需要用到angular-auto-validate这个第三方module。

有关angular-auto-validate:

  • 安装:npm i angular-auto-validate
  • 引用:<script src="../node_modules/angular-auto-validate/dist/jcs-auto-validate.min.js"></script>
  • module依赖:var myApp = angular.module("app", ["jcs-autoValidate"]);

为了实现错误信息本地化,还需要angular-localize这个第三方module:

  • 安装:npm install angular-localize --save
  • module依赖:var myApp = angular.module("app", ["localize"]);
  • 引用:
<script src="../node_modules/angular-sanitize/angular-sanitize.min.js"></script>
<script src="../node_modules/angular-localize/angular-localize.min.js"></script>

此外,当点击提交表单按钮,需要禁用按钮并显示一种等待效果,需要用到angular-ladda这个第三方module:

  • 安装:bower install angular-ladda --save
  • module依赖:var myApp = angular.module("app", ["angular-ladda"]);
  • 引用:
<link rel="stylesheet" href="../bower_components/ladda/dist/ladda-themeless.min.css"/>

<script src="../bower_components/ladda/dist/spin.min.js"></script>
<script src="../bower_components/ladda/dist/ladda.min.js"></script>
<script src="../bower_components/angular-ladda/dist/angular-ladda.min.js"></script>

页面如下:

<html>
<head>
 <meta charset="gb2312">
 <title></title>
 <link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css"/>
 <link rel="stylesheet" href="../bower_components/ladda/dist/ladda-themeless.min.css"/>
 <link rel="stylesheet" href="../css/main.css"/>
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
 <div class="container">
 <div class="navbar-header">
  <a href="/" class="navbar-brand">Form Validating Auto</a>
 </div>
 </div>
</nav>

<div class="container main-content" ng-controller="myCtrl1">
 <!--novalidate让表单不要使用html验证-->
 <!--theForm变成scope的一个字段-->
 <form ng-submit="onSubmit()" novalidate="novalidate">
 <div class="form-group">
  <label for="name" class="control-label">Name</label>
  <input type="text" class="form-control" id="name" ng-model="formModel.name" required="required"/>
 </div>

 <div class="form-group">
  <label for="email" class="control-label">Email</label>
  <input type="email" class="form-control" id="email" ng-model="formModel.email" required="required"/>

 </div>

 <div class="form-group">
  <label for="username" class="control-label">Username</label>
  <input type="text"
    class="form-control"
    id="username"
    ng-model="formModel.username"
    required="required"
    ng-pattern="/^[A-Za-z0-9_]{1,32}$/"
    ng-minlength="7"
    ng-pattern-err-type="badUsername"
  />
 </div>

 <div class="form-group">
  <label for="age" class="control-label">Age</label>
  <input type="number"
    class="form-control"
    id="age"
    ng-model="formModel.age"
    required="required"
    min="18"
    max="65"
    ng-min-err-type="tooYoung"
    ng-max-err-type="tooOld"
  />
 </div>

 <div class="form-group">
  <label for="sex" class="control-label">Sex</label>
  <select name="sex" id="sex" class="form-control" ng-model="formModel.sex" required="required">
  <option value="">Please choose</option>
  <option value="male">Mail</option>
  <option value="femail">Femail</option>
  </select>
 </div>

 <div class="form-group">
  <label for="password" class="control-label">Password</label>
  <input type="text" class="form-control" id="password" ng-model="formModel.password" required="required" ng-minlength="6"/>
 </div>

 <div class="form-group">
  <!--<button class="btn btn-primary" ng-click="onSubmit()">Register</button>-->
  <button class="btn btn-primary"
    ladda = "submitting"
    data-style="expand-right"
    type="submit">
  <span ng-show="submitting">正在注册...</span>
  <span ng-show="!submitting">注册</span>
  </button>
 </div>

  <pre>
  {{formModel | json}}
  </pre>
 </form>
</div>
<script src="../node_modules/angular/angular.min.js"></script>

<script src="form_validation_auto.js"></script>
<script src="../node_modules/angular-auto-validate/dist/jcs-auto-validate.min.js"></script>
<script src="../node_modules/angular-sanitize/angular-sanitize.min.js"></script>
<script src="../node_modules/angular-localize/angular-localize.min.js"></script>

<script src="../bower_components/ladda/dist/spin.min.js"></script>
<script src="../bower_components/ladda/dist/ladda.min.js"></script>
<script src="../bower_components/angular-ladda/dist/angular-ladda.min.js"></script>

</body>
</html>

先看提交按钮: 

<div class="form-group">
 <!--<button class="btn btn-primary" ng-click="onSubmit()">Register</button>-->
 <button class="btn btn-primary"
   ladda = "submitting"
   data-style="expand-right"
   type="submit">
 <span ng-show="submitting">正在注册...</span>
 <span ng-show="!submitting">注册</span>
 </button>
</div>
  • ladda属性值为bool值,true表示显示动态等待效果,false不显示动态等待效果,这里的submitting是scope中的一个属性
  • data-style="expand-right"表示在按钮的右侧显示动态等待效果

再拿表单中的Age字段来说: 

<div class="form-group">
 <label for="age" class="control-label">Age</label>
 <input type="number"
   class="form-control"
   id="age"
   ng-model="formModel.age"
   required="required"
   min="18"
   max="65"
   ng-min-err-type="tooYoung"
   ng-max-err-type="tooOld"
 />
</div>

其中,min, max为AgularJS的directive,而ng-min-err-type是angular-auto-validate的directive。这里遵循的惯例是ng-AngularJS表单验证的directive名称-err-type,而tooYoung和tooOld的作用是什么,又是在哪里用上了呢?

是在module层面用上了,定义在了form_validation_auto.js文件中。 

var myApp1 = angular.module('myApp1',['jcs-autoValidate','localize','angular-ladda']);

myApp1.run(function(defaultErrorMessageResolver){
 defaultErrorMessageResolver.getErrorMessages().then(function(errorMessages){
  errorMessages['tooYoung'] = '年龄必须小于{0}';
  errorMessages['tooOld'] = '年龄不能大于{0}';
  errorMessages['badUsername'] = '用户名只能包含数字、字母或下划线';
 });
});

myApp1.controller('myCtrl1', function($scope, $http){
 $scope.formModel = {};
 $scope.submitting = false;

 $scope.onSubmit = function(){

  $scope.submitting = true;
  console.log('已提交');
  console.log($scope.formModel);

  $http.post('url',$scope.formModel)
   .success(function(data){
    console.log(':)');
    $scope.submitting = false;
   })
   .error(function(data){
    console.log(':(');
    $scope.submitting = false;
   });
 };
});

以上就是本文的全部内容,希望对AngularJS手动表单验证能够熟练操作。

Javascript 相关文章推荐
在JavaScript中使用inline函数的问题
Mar 08 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
jQuery实现的多滑动门,多选项卡效果代码
Mar 28 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
Apr 11 Javascript
javascript 中iframe高度自适应(同域)实例详解
May 16 Javascript
利用Javascript开发一个二维周视图日历
Dec 14 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
a标签调用js的方法总结
Sep 05 Javascript
vue实现图片按比例缩放问题操作
Aug 11 Javascript
javascript实现右侧弹出“分享到”窗口效果
Feb 01 #Javascript
AngularJS手动表单验证
Feb 01 #Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 #Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 #Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 #Javascript
理解javascript中的严格模式
Feb 01 #Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 #Javascript
You might like
php 中phar包的使用教程详解
2018/10/26 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
JS实现随机抽选获奖者
2019/11/07 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
Python中整数的缓存机制讲解
2019/02/16 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
python线程优先级队列知识点总结
2021/02/28 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
Champion官网:美国冠军运动服装
2017/01/25 全球购物
财务助理岗位职责
2013/11/10 职场文书
会计电算化专业求职信
2014/06/10 职场文书
2019年思想汇报
2019/06/20 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
简单介绍Python的第三方库yaml
2021/06/18 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
Nginx 常用配置
2022/05/15 Servers
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers