angularjs 表单验证
表单验证<AngularJs>常用的表单验证指令1. 必填项验证某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2. 最小长度验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3. 最大长度验证表单输入的文本长度是否小于或等于某个最大值,在输入字段上使用指令ng-maxlength="{number}": <input type="text" ng-maxlength="20" /> 4. 模式匹配使用ng-pattern="/PATTERN/"来确保输入能够匹配指定的正则表达式: <input type="text" ng-pattern="/[a-zA-Z]/" /> 5. 电子邮件验证输入内容是否是电子邮件,只要像下面这样将input的类型设置为email即可: <input type="email" name="email" ng-model="user.email" /> 6. 数字验证输入内容是否是数字,将input的类型设置为number: <input type="number" name="age" ng-model="user.age" /> 7. URL验证输入内容是否是URL,将input的类型设置为 url: <input type="url" name="homepage" ng-model="user.facebook_url" />
<div class="col-md-6"> form role="form" class="form-horizontal"> ="form-group"> ="col-md-4"> label for="name">1.必填项</labeldiv="col-md-8"input ="form-control" id="name" type="text" required ng-model='user.name' /> ="minlength">2.最小长度=5> </type="minlength" ng-minlength="5" ng-model="user.minlength"="form-control" >3.最大长度=20> ="user.maxlength" ng-maxlength="20">4. 模式匹配 </> ="user.pattern" ng-pattern="/^[a-zA-Z]*d$/"="email">5. 电子邮件="email" name="user.email"="age">6. 数字="number"="age"="user.age"="url"> 7. URL="url"="homepage"="user.url"="form-group text-center"="btn btn-primary btn-lg"="submit" value="提交" /> form> > ="col-md-12"> 1.必填项:{{user.name}}br> 2.最小长度=5:{{user.minlength}}> 3.最大长度=20:{{user.maxlength}}> 4.模式匹配:{{user.pattern}}> 5.电子邮件:{{user.email}}> 6.数字:{{user.age}}> 7.URL:{{user.url}}> 在测试中我们发现,只有当表达式满足验证,才会实时进行双向绑定。同时我们也发现,效果图如下: 似乎并没有发生什么问题,但是如果我们将其移植到一个队HTML5验证不怎么好的浏览器再来测试一下【本例IE9】,问题来了,某些字段完全没得验证
屏蔽浏览器对表单的默认验证行为
未修改过的表单布尔值属性,表示用户是否修改了表单。如果为ture,表示没有修改过;false表示修改过: formName.inputFieldName.$pristine; 修改的表单布尔型属性,当且仅当用户实际已经修改的表单。不管表单是否通过验证: formName.inputFieldName.$dirty 经过验证的表单布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为true: formName.inputFieldName.$valid 未通过验证的表单formName.inputFieldName.$invalid
错误这是AngularJS提供的另外一个非常有用的属性:$error对象。它包含当前表单的所有验证内容,以及它们是否合法的信息。用下面的语法访问这个属性 formName.inputfieldName.$error 如果验证失败,这个属性的值为true;如果值为false,说明输入字段的值通过了验证。 下面我们对这些验证指令进行测试: <!DOCTYPE html> html ng-app="myTest"headmeta name="viewport" content="width=device-width" /> title>Indexlink href="~/Content/css/bootstrap.min.css" rel="stylesheet" script src="~/Javascript/angular.min.js"> scriptstyle ="text/css"> body { padding-top: 30px; } stylebody ng-Controller="MyController"="myForm" ng-submit="submitForm(myForm.$valid)"="form-horizontal" novalidate="form-group has-feedback"> /> span ="glyphicon glyphicon-ok form-control-feedback" ng-show="myForm.name.$dirty && myForm.name.$valid"></span="myForm.minlength.$dirty && myForm.minlength.$valid"="maxlength"="maxlength"="myForm.maxlength.$dirty && myForm.maxlength.$valid"="pattern"="pattern"="myForm.pattern.$dirty && myForm.pattern.$valid"="myForm.email.$dirty && myForm.email.$valid"/> ="myForm.age.$dirty && myForm.age.$valid"="myForm.url.$dirty && myForm.url.$valid"="form-group text-center"="btn btn-primary btn-lg" ng-disabled="myForm.$invalid"> > 1.必填项:{{user.name}} $pristine 【没修改】:{{myForm.name.$pristine }} $dirty【修改过】:{{myForm.name.$dirty}} $invalid【验证失败】:{{myForm.name.$invalid}} $invalid【验证成功】:{{myForm.name.$valid}} required:{{myForm.name.$error.required}} > 2.最小长度=5:{{user.minlength}} $pristine 【没修改】:{{myForm.minlength.$pristine }} $dirty【修改过】:{{myForm.minlength.$dirty}} $invalid【验证失败】:{{myForm.minlength.$invalid}} $invalid【验证成功】:{{myForm.minlength.$valid}} $error【错误详情】:{{myForm.minlength.$error}} > 3.最大长度=20:{{user.maxlength}} $pristine 【没修改】:{{myForm.maxlength.$pristine }} $dirty【修改过】:{{myForm.maxlength.$dirty}} $invalid【验证失败】:{{myForm.maxlength.$invalid}} $invalid【验证成功】:{{myForm.maxlength.$valid}} $error【错误详情】:{{myForm.maxlength.$error}}> 4.模式匹配:{{user.pattern}} $pristine 【没修改】:{{myForm.pattern.$pristine }} $dirty【修改过】:{{myForm.pattern.$dirty}} $invalid【验证失败】:{{myForm.pattern.$invalid}} $invalid【验证成功】:{{myForm.pattern.$valid}} $error【错误详情】:{{myForm.pattern.$error}}> 5.电子邮件:{{user.email}} $pristine 【没修改】:{{myForm.email.$pristine }} $dirty【修改过】:{{myForm.email.$dirty}} $invalid【验证失败】:{{myForm.email.$invalid}} $invalid【验证成功】:{{myForm.email.$valid}} $error【错误详情】:{{myForm.email.$error}}> 6.数字:{{user.age}} $pristine 【没修改】:{{myForm.age.$pristine }} $dirty【修改过】:{{myForm.age.$dirty}} $invalid【验证失败】:{{myForm.age.$invalid}} $invalid【验证成功】:{{myForm.age.$valid}} $error【错误详情】:{{myForm.age.$error}}> 7.URL:{{user.url}} $pristine 【没修改】:{{myForm.url.$pristine }} $dirty【修改过】:{{myForm.url.$dirty}} $invalid【验证失败】:{{myForm.url.$invalid}} $invalid【验证成功】:{{myForm.url.$valid}} $error【错误详情】:{{myForm.url.$error}}bodyhtml="text/javascript"> angular.module('myTest,[]) .controller(myControllerfunction($scope) { $scope.submitForm = (isValid) { if (!isValid) { alert(验证失败); } }; } ); 效果如下: 同时,ng针对这几种验证指令,针对性的设置了一些css样式它们包括: .ng-valid { } .ng-invalid { } .ng-pristine { } .ng-dirty { } /* really specific css rules applied by angular */ .ng-invalid-required { } .ng-invalid-minlength { } .ng-valid-max-length { } 它们对应着表单输入字段的特定状态。
首先我们来看一个简单的例子: angular.module("myTest",[]) .directive('multipleEmail',[function () { return { require: "ngModel",link: function (scope,element,attr,ngModel) { if (ngModel) { var emailsRegexp = /^([a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(.[a-z0-9-]+)*[;;]?)+$/i; } var customValidator = function (value) { var validity = ngModel.$isEmpty(value) || emailsRegexp.test(value); ngModel.$setValidity("multipleEmail",validity); return validity ? value : undefined; }; ngModel.$formatters.push(customValidator); ngModel.$parsers.push(customValidator); } }; }]) 页面Html部分代码如下: role="custom_form"="col-sm-2 control-label">多个email> ="col-sm-10"multiple-email name="user_email" required class placeholder="自定义验证,多个邮箱地址,以“;”或者“;”分割" /> 验证通过:{{custom_form.user_email.$valid}} ng-disabled="custom_form.$invalid" |