AngularJS form表单验证(非常全面)

构建一个ng表单

1.确保form上标签有一个name属性,像下面的例子一样。最好再加一个novalidate=”novalidate”

2.form中不能有action属性。提交交由ng-submit处理

3.每个input一定要有ng-model,最好有一个name方便引用。然后用require或者ng-minlength之类才起作用

<form name="form" novalidate="novalidate">
  <label name="email">Your email</label>
  <input type="email" name="email" ng-model="email" placeholder="Email Address" />
</form>

ng默认提供了验证

验证是否已输入文字,只需在标签上加上required:

<input type="text" ng-model="user.name" required />

验证至少输入{number}个字符,使用指令ng-minlength=“{number}”:

<input type="text" ng-model="user.name" ng-minlength="5" />

验证至多输入{number}个字符,使用指令ng-maxlength=“{number}”:

<input type="text" ng-model="user.name" ng-maxlength="20" />

确保输入匹配一个正则表达式,使用指令ng-pattern="/PATTERN/":

<input type="text" ng-model="user.name" ng-pattern="/a-zA-Z/" />

验证输入是一个Email,设置input的type属性为email:

<input type="email" name="email" ng-model="user.email" />

验证输入是一个数字,设置input的type属性为number:

<input type="number" name="number" ng-model="user.age" />

验证输入是一个URL,设置input的type属性为url

<input type="url" name="homepage" ng-model="user.weburl" />

实战一个例子(需要验证一个email为发须并且最小为10,最长为20,并且并须要含有m字符。没有实际意义,只是演示例子)

<!doctype html>
<html ng-app="myApp">
<head>
 <meta charset="UTF-8">
 <title>表单</title>
</head>
<body>
<form name="form" novalidate="novalidate">
 <input type="email" ng-model="user.email" ng-minlength="5" ng-maxlength="20" ng-pattern="/m.*/" required/>
 <input type="submit" value="确定"/>
</form>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
 var myApp = angular.module('myApp', []);
</script>
</body>
</html>

运行这个例子先啥都不做,查看元素

 

注意看这些标出来的东西有点意思。然后输入字符就能看到他们的进行变化。然后我来解释一下这些东西。(可以看到一开始required就为ng-invalid-required。但其他的都为valid)

验证的时候感觉好像出现一个bug.具体如下:(如有知道的请帮助一下解释一下这个问题)

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表单</title>
</head>
<body>
<form name="form" novalidate="novalidate">
    <input type="email" ng-model="user.email" ng-minlength="5" ng-maxlength="20" ng-pattern="/m.*/" required/>
    <input type="email" ng-model="user.email2"  required/>
    <input type="submit" value="确定"/>
</form>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
</script>
</body>
</html>

第一个例子的email居然ng-valid-email。感觉有点问题。难道是用了type=”email”之类就不能用ng-minlength ng-pattern之类了吗?觉得可能是ng版本问题,但换了低版本之后发现同样有问题。希望有人能解释一下这个问题。github有这个问题 https://github.com/angular/angular.js/issues/7849 而且email验证的时候github上有人提出了其他问题,https://github.com/angular/angular.js/issues/5899,看来对于type=”email”和 url之类要使用的时候多注意,我的建议是尽量不用。如果需要请写自定义验证。下面我会介绍,确实是有够蛋疼之处。由于这种问题,所以我写的表单不会出现type=”email” type=”url” type=”number”之类,如果ng解决了这个问题。我再进行更新。

表单的状态

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表单</title>
</head>
<body>
<form name="form">
    <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
    <input type="text" name="email" ng-model="user.email" required
           ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
</form>
 
{{ a }}
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
</script>
</body>
</html>

我们把焦点只聚积到表单(class有如下属性ng-pristine ng-invalid ng-invalid-required),如果变动在第一个输入框中输入s,现在class就变了ng-invalid ng-invalid-required ng-dirty ng-invalid-minlength

 

 

 

 

现在需要解释一些东西了

AngularJS将DOM验证的结果保存在$scope对象中。这使我们能够实时做出一些处理。提供给我们的属性有:

$pristine表示用户是否修改了表单。如果为ture,表示没有修改过:

formName.$pristine;

$dirty当且用户是否已经修改过表单:

formName.$dirty

我们来直观的看下
<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表单</title>
</head>
<body>
<div ng-controller="testController">
    <form name="form">
        <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
        <input type="text" name="email" ng-model="user.email" required
               ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
    </form>
    <button ng-click="getFormStatus()">查看表单状态</button>
</div>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('testController', function($scope){
        $scope.getFormStatus = function(){
            console.log($scope.form);
        }
    })
</script>
</body>
</html>
 

 

 

 

如果表单进行变动的时候,可以看到表单的一些属性进行了实时的变化。观察上面四个,你不难发现。$dirty和$valid是相反的,一个true,一个false或者一个false一个true,同样$valid,是得到现在是否通过验证的和$invalid也是相反的。

表单的部分说的差不多了,然后说表单中的每项的东西

 

 

 

 

可以看到每个表单项也有跟表单有些共同的属性,注意一下$error对象,记录了是哪个出现错误正确的。

实战简单实例

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="UTF-8">
    <title>表单</title>
    <style>
        /*在修改的表单项上才显示错误信息*/
        input.ng-dirty.ng-invalid {
            border: 1px solid red;
        }
    </style>
</head>
<body>
<div ng-controller="testController">
    <form name="form" ng-submit="save()" novalidate="novalidate">
 
        <input type="text" name="name" ng-model="user.name" required ng-minlength="5" ng-maxlength="20"/>
        <span class="error" ng-show="form.$dirty && form.name.$invalid">填写不正确</span>
        <br />
 
        <input type="text" name="email" ng-model="user.email" required
               ng-pattern="/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/"/>
        <span class="error" ng-show="form.$dirty && form.name.$invalid">填写格式错误</span>
        <br />
        <input type="submit" value="提交"/>
    </form>
 
</div>
<script src="http://cdn.staticfile.org/angular.js/1.3.0-beta.8/angular.min.js"></script>
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('testController', function($scope){
        $scope.save = function () {
            //获取到表单是否验证通过
            if($scope.form.$valid){
                alert('通过验证可以提交表单');
            }else{
                alert('表单没有通过验证');
            }
        }
    })
</script>
</body>
</html>

显示效果如图,当然有人有疑问了,比如第一个表单项,我不想提示填写不正确这么模糊的说法,而是告诉他是不是因为他没有填写,或者是因为他字符不够,或者是因为你超过了最大字符。这也非常好办,还记的$error吗?可以通过form.name.$error.minlength之类的得到啊。明白了不。还是不明白,好吧,再给逗逼做个代码实例

也许你稍为有些思路了。但还是很多时候力不从心,比如哥想自定义验证或者通过后台验证unique呢?再比如他这个一边输入一边就提示效果太他妈差了。我想在提交时提示或者我想在鼠标不在这个焦点的时候再提示。OK,也许你还有很多想法,但上篇已经结束了,容我整理思路,带来表单验证中篇。

时间: 2025-01-25 06:02:25

AngularJS form表单验证(非常全面)的相关文章

angularJS的表单验证示例详解

angular自带的有表单验证,直接上代码: <html>  <head>   <link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">   <script src="//cdn.bootcss.com/angular.js/1.3.17/angular.js"></script

详解AngularJS实现表单验证_AngularJS

开始学习AngularJS表单验证: 常用的表单验证指令 1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: 复制代码 代码如下: <<input type="text" required />   2. 最小长度 验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": 复制代码 代码如下: <<input type="t

AngularJS手动表单验证_AngularJS

所谓手动验证是通过AngularJS表单的属性来验证,而成为AngularJS表单必须满足两个条件: 1.给form元素加上novalidate="novalidate": 2.给form元素加上name="theForm", 如下: <!DOCTYPE html> <html lang="en" ng-app="myApp1"> <head> <meta charset="

js-为什么这个form表单验证不成功?

问题描述 为什么这个form表单验证不成功? function checkDelForm() { var uids = -1; uids = document.getElementsByName(""delUids"").length; if (uids == -1) { alert(""请选择要删除的用户""); return false; } else { return true; } } <form name=&q

PHP Form表单验证:PHP form validator使用说明

在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验证方式多种多样,早期一般使用Javascript对PHP表单进行验证,随着WEB2.0时代的到来,考虑到用户体验,使用Jquery Form表单验证插件是常用手法,今天我要介绍的是一个PHP表单验证类PHP form validator,其可应用于一般的PHP表单验证,也可以和第三方程序或Javas

基于Bootstrap+jQuery.validate实现Form表单验证_jquery

基于Bootstrap jQuery.validate Form表单验证实践项目结构 : github 上源码地址:https://github.com/starzou/front-end-example 1.form 表单代码[html] 复制代码 代码如下: <!DOCTYPE html>  <html>      <head>          <title>Bootstrap Form Template</title>         

thinkphp form表单验证失败了为啥还会提交

问题描述 thinkphp form表单验证失败了为啥还会提交 无标题 用户名: 密码: 验证码: 登陆 </form> function sub(){ var u=document.frm.user_name.value; var p=document.frm.pwd.value; var c=document.frm.code.value; var f=document.frm; if(u=='' || p=='' || c==''){ alert('用户名,密码,验证码不能为空'); }

JS组件Form表单验证神器BootstrapValidator_javascript技巧

本文为大家分享了JS组件Form表单验证神器BootstrapValidator,供大家参考,具体内容如下 1.初级用法来看bootstrapvalidator的描述:A jQuery form validator for Bootstrap 3.从描述中我们就可以知道它至少需要jQuery.bootstrap的支持.我们首先引入需要的js组件: <script src="~/Scripts/jquery-1.10.2.js"></script> <scr

详解ASP.NET MVC Form表单验证_实用技巧

一.前言 关于表单验证,已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下.本来想从用户注册开始写起,但发现东西比较多,涉及到界面.前端验证.前端加密.后台解密.用户密码Hash.权限验证等等,文章写起来可能会很长,所以这里主要介绍的是登录验证和权限控制部分,有兴趣的朋友欢迎一起交流. 一般验证方式有Windows验证和表单验证,web项目用得更多的是表单验证.原理很简单,简单地说就是利用浏览器的cookie,将验证令牌存储在客户端浏览器上,co