客户端表单验证是AngularJS里面最酷的功能之一,AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。
在AngularJS中,有许多表单验证指令。在这里,我们将谈谈几个最流行指令,然后我们将讨论如何编写自定义的验证。
<form name="form"> <label name="email">Your email</label> <input type="email" name="email" ng-model="email" placeholder="Email Address" /> </form>
AngularJS使得我们可以在不用额外努力的情况下轻松的处理客户端表单验证。虽然我们不能仅靠客户端验证来保持我们的Web应用程序的安全性,但他们提供了良好即时反馈到表单上。
要使用表单验证,我们首先必须确保form标签有一个name属性,像上面的例子一样。明白了吗?太好了!
所有输入字段可以进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。
通常需要在form标签中加上novalidate属性,这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。
让我们来看看我们可以在input设置哪些验证:
1.必填
验证是否已输入字符,只需在标签上加上required:
<input type="text" required />
2.最小长度
验证输入至少输入{number}个字符,使用AngularJS指令的ng-minlength=“{number}”:
<input type="text" ng-minlength=5 />
3.最大长度
验证输入字符要小于等于{number}个字符,使用AngularJS指令的ng-maxlength=“{number}”:
<input type="text" ng-maxlength=20 />
4.正则匹配
要确保输入匹配一个正则表达式,使用AngularJS的指令ng-pattern="/PATTERN/":
<input type="text" ng-pattern="/a-zA-Z/" />
5.Email
验证输入字符是一个电子邮件地址,只需设定input的type属性为email,像这样:
<input type="email" name="email" ng-model="user.email" />
6.数字
验证输入字符是一个数字,同样只需设定input的type属性为number,像这样:
<input type="number" name="email" ng-model="user.age" />
7.Url
验证输入字符是一个URL地址,同样只需设定input的type属性为url,像这样:
<input type="url" name="homepage" ng-model="user.facebook_url" />
8.自定义验证
AngularJS可以很容易的使用指令来添加自定义验证。例如,我们要验证我们的用户名是可用的(在数据库中不重复)。要做到这一点,我们将实现一个指令,它在输入字符变化时触发一个Ajax请求:
var app = angular.module('validationExample', []); app.directive('ensureUnique', ['$http', function($http) { return { require: 'ngModel', link: function(scope, ele, attrs, c) { scope.$watch(attrs.ngModel, function() { $http({ method: 'POST', url: '/api/check/' + attrs.ensureUnique, data: {'field': attrs.ensureUnique} }).success(function(data, status, headers, cfg) { c.$setValidity('unique', data.isUnique); }).error(function(data, status, headers, cfg) { c.$setValidity('unique', false); }); }); } } }]);
9.验证表单状态
AngularJS将DOM验证的结果保存在$scope对象中。这使我们能够实时做出一些响应。提供给我们的属性有:
请注意,这是这个属性的格式:formName.inputFieldName.property
a.未修改过的表单
布尔值属性,表示用户是否修改了表单。如果为ture,表示没有修改过;false表示修改过:
formName.inputFieldName.$pristine;
b.修改的表单
布尔型属性,当且仅当用户实际已经修改的表单。不管表单是否通过验证:
formName.inputFieldName.$dirty
c.经过验证的表单
布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为true:
formName.inputFieldName.$valid
d.未通过验证的表单
布尔型属性,它指示表单是否通过验证。如果表单当前没有通过验证,他将为true:
formName.inputFieldName.$invalid
最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,如果要设置特定的class时,他们也非常有用的。
e.错误
另一个有用的属性是AngularJS提供给我们的$error对象。这个对象包含input的每一个验证是有效的还是无效的(一个集合)。为了访问这个属性,使用下面的语法:
formName.inputfieldName.$error
如果验证失败,则此属性将是true的,而如果它是false的,那么该值通过验证的。
10.无害的一些样式
当AngularJS处理的表单验证时,它将根据验证的状态增加一些特定的class属性。这些class被命名为类似的属性,我们可以检查。
这些class是:
.ng-pristine {} .ng-dirty {} .ng-valid {} .ng-invalid {}
这些class对应着其对应的验证对象的结果。
当一个字段是无效的, .ng-invalid将被应用到这个字段上。我们可以通过css来设置这些class的样式:
input.ng-invalid { border: 1px solid red; } input.ng-valid { border: 1px solid green; }
11.全部放在一起
让我们编写一个注册表单。本申请表单将包括这个人的名字,他们的电子邮件,以及所需的用户名。
让我们定义一个form表单:
<form name="signup_form" novalidate ng-submit="signupForm()"> <fieldset> <legend>Signup</legend> <button type="submit" class="button radius">Submit</button> </fieldset> </form>
这个表单的名字是signup_form ,当我们点击提交时我们将调用signupForm()方法。
现在,让我们添加用户的Name属性:
<div class="row"> <div class="large-12 columns"> <label>Your name</label> <input type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required /> </div> </div>
首先我想说明我使用了 Foundation 作为我的css框架,所以你将在代码中看到它的相关语法。 我们增加了一个名字为name的输入框,并且对象绑定在$scope对象的signup.name对象上(通过ng-model)。
我们还设置了几个验证。这些验证分别是:我们必须有一个长度为3个或更多字符的名字。并且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,我们设置名称应该是必填的。
当如果表单无效时,让我们用属性来控制显示还是隐藏错误列表。我们还将使用$dirty属性,以确保当用户没有输入字符前错误提示不显示:
<div class="row"> <div class="large-12 columns"> <label>Your name</label> <input type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required /> <div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid"> <small class="error" ng-show="signup_form.name.$error.required"> Your name is required. </small> <small class="error" ng-show="signup_form.name.$error.minlength"> Your name is required to be at least 3 characters </small> <small class="error" ng-show="signup_form.name.$error.maxlength"> Your name cannot be longer than 20 characters </small> </div> </div> </div>
在之前,当输入内容改变时它只能告诉我们我们输入是否有效。这一次,我们将看到当那些没有通过的验证时的错误信息。
让我们来看看接下来的验证,一个电子邮件:
<div class="row"> <div class="large-12 columns"> <label>Your email</label> <input type="email" placeholder="Email" name="email" ng-model="signup.email" ng-minlength=3 ng-maxlength=20 required /> <div class="error" ng-show="signup_form.email.$dirty && signup_form.email.$invalid"> <small class="error" ng-show="signup_form.email.$error.required"> Your email is required. </small> <small class="error" ng-show="signup_form.email.$error.minlength"> Your email is required to be at least 3 characters </small> <small class="error" ng-show="signup_form.email.$error.email"> That is not a valid email. Please input a valid email. </small> <small class="error" ng-show="signup_form.email.$error.maxlength"> Your email cannot be longer than 20 characters </small> </div> </div> </div>
这一次(包括整个表单),我们编写电子邮件字段。请注意,我们设置了input的type属性为email并且添加了$error.email错误信息。这是基于AngularJS的电子邮件验证(使用HTML5的属性)。
最后,让我们来看看在我们的最后一个输入框,用户名:
<div class="large-12 columns"> <label>Username</label> <input type="text" placeholder="Desired username" name="username" ng-model="signup.username" ng-minlength=3 ng-maxlength=20 ensure-unique="username" required /> <div class="error" ng-show="signup_form.username.$dirty && signup_form.username.$invalid"> <small class="error" ng-show="signup_form.username.$error.required">Please input a username</small> <small class="error" ng-show="signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small> <small class="error" ng-show="signup_form.username.$error.maxlength">Your username cannot be longer than 20 characters</small> <small class="error" ng-show="signup_form.username.$error.unique">That username is taken, please try another</small> </div> </div>
在我们的最后一个字段,我们使用我们之前编写的自定义验证。这个自定义验证使用的AngularJS指令:
app.directive('ensureUnique', ['$http', function($http) { return { require: 'ngModel', link: function(scope, ele, attrs, c) { scope.$watch(attrs.ngModel, function() { $http({ method: 'POST', url: '/api/check/' + attrs.ensureUnique, data: {'field': attrs.ensureUnique} }).success(function(data, status, headers, cfg) { c.$setValidity('unique', data.isUnique); }).error(function(data, status, headers, cfg) { c.$setValidity('unique', false); }); }); } } }]);
当表单输入是有效的时,它将发送POST api/check/username请求到服务器来检查用户名是否可用。现在,很明显,因为我们在这里只谈论前端代码,我们没有为后端编写测试,尽管很容易。
更新: 根据评论的意见,我已经加入了服务器超时检查。要查看完整的源代码,请点击here。
最后,我们加上提交按钮,我们可以使用ng-disabled指令来根据验证是否有效控制按钮的禁用和启用:
<button type="submit" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>
正如我们上面所说的,表单是否有效的属性$invalid给我们提供了便利。
12.实际应用
虽然立即验证是很棒的,它可以立即提醒用户,但是当他们正在输入很长的能通过验证的文字时,他们讲在输入中途看到错误提示。你可以更好的来处理这一点。当用户点击提交时,或者当他们将光标移开输入框之后,让我们来看看这两种方式。
a.点击提交后显示验证信息
要在用户试图提交表单时显示的验证,你可以通过在scope中设置一个'submitted'值,并检查该值来控制显示错误。
例如,让我们来看看第一个例子,只有在点击提交表单时才显示错误。使用ng-show指令来控制显示,我们可以添加一个检查,看是否已点击提交按钮:
<form name="signup_form" novalidate ng-submit="signupForm()"> <fieldset> <legend>Signup</legend> <div class="row"> <div class="large-12 columns"> <label>Your name</label> <input type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required /> <div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && signup_form.submitted"> <small class="error" ng-show="signup_form.name.$error.required"> Your name is required. </small> <small class="error" ng-show="signup_form.name.$error.minlength"> Your name is required to be at least 3 characters </small> <small class="error" ng-show="signup_form.name.$error.maxlength"> Your name cannot be longer than 20 characters </small> </div> </div> </div> <button type="submit" class="button radius">Submit</button> </fieldset> </form>
现在,那个错误信息的div只将在signup_form.submitted为true时显示。我们可以这样实现这个signupForm方法:
app.controller('signupController', ['$scope', function($scope) { $scope.submitted = false; $scope.signupForm = function() { if ($scope.signup_form.$valid) { // Submit as normal } else { $scope.signup_form.submitted = true; } } }]);
现在,当用户尝试提交表单并且同时有一个无效的元素时,你可以捕获它,并告诉他们错误的原因。
b.当时去焦点时验证错误
如果你想保留错误验证的实时性,那么可以在用户离开该输入框时显示错误信息。要做到这一点,我们可以添加一个指令,将添加一个新的变量。
我们使用ngFocus指令,它看起来像:
app.directive('ngFocus', [function() { var FOCUS_CLASS = "ng-focused"; return { restrict: 'A', require: 'ngModel', link: function(scope, element, attrs, ctrl) { ctrl.$focused = false; element.bind('focus', function(evt) { element.addClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = true;}); }).bind('blur', function(evt) { element.removeClass(FOCUS_CLASS); scope.$apply(function() {ctrl.$focused = false;}); }); } } }]);
要使用ngFocus,我们只需要简单加上这个指令到输入框元素上,像这样:
<input ng-class="{error: signup_form.name.$dirty && signup_form.name.$invalid}" type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required ng-focus />
加上ngFocus指令后,将在输入框的blur和focus事件中注册相应操作,当焦点在该输入框时,它添加一个class(ng-focused),并且该输入框的$focused属性也将变为true。因此,你可以根据需求是否在焦点上来个性化设置显示错误消息。例如:
<div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">
13小结
a.如果不想在页面加载时就显示出提示错误信息,可以这样干:
<div class="error" ng-show="addPsaForm.RINM.$dirty "> <span class="error" ng-show="addPsaForm.RINM.$error.required">不能为空</span> <span class="error" ng-show="addPsaForm.RINM.$error.maxlength">长度越界:1-128</span> </div>
判断表单是否被用户修改,来显示或者隐藏提示信息。
b.当表单验证不通过时,可以使submit按钮禁止点击。
<input type="submit" value="提交" ng-disabled="addPsaForm.$invalid"/>
文章来源:http://www.cnblogs.com/woshinidezhu/p/Form-validation-with-AngularJS.html
相关推荐
在"nwk-videochat"项目中,AngularJS负责处理用户界面的交互逻辑,如表单验证、数据绑定和指令扩展,提高了开发效率并确保了代码的可维护性。 【项目结构】 "nwk-videochat-master"压缩包包含了项目的源代码。通常...
在表单验证中,AngularJS还提供了一个特殊的对象——$error对象。通过这个对象,我们可以访问到针对不同验证规则的详细错误信息。在视图中,可以使用$show指令来根据$erroe对象的值,来显示相应的提示信息。 在使用...
7. **表单处理**:AngularJS提供了表单验证和提交的机制,如`ngForm`和`ngSubmit`指令,以及`ngRequired`、`ngMinlength`等验证指令。 书中不同章节的源代码文件(如Ch1至Ch11)可能涵盖了以上各个方面,从基础概念...
51AngularJS表单与传统表单的比较139 介绍ngModel指令141 52创建用户信息表单142 53理解输入指令143 添加所需验证143 使用基于文本的输入(text、textarea、e—mail、URL、number)143 使用checkbox输入144 ...
- **表单验证**:AngularJS提供了强大的表单验证机制,可以轻松实现客户端验证逻辑。 - **内置验证规则**:如`required`、`email`等,用于检查表单字段是否符合指定格式。 - **自定义验证器**:可以根据需要创建...
比如,在`login`控制器中,可能会有用于处理用户输入和验证的函数和属性。 从知识点来看,AngularJS和Bootstrap的结合使用为开发者提供了一个功能强大的前端开发工具集。使用AngularJS的MVC架构、指令和过滤器等...
- **表单验证**:提供内置的表单验证功能。 - **事件绑定**:将JavaScript逻辑与DOM元素相关联。 - **组件化**:支持将HTML模板封装成可重用的组件。 #### 端对端解决方案 AngularJS的目标是成为一个完整的端对端...
在客户端,可以使用JavaScript进行表单验证,确保用户输入符合预期格式,例如邮箱、电话号码等。这样可以在数据到达服务器前就发现问题,提供更好的用户体验。 **5. AJAX与异步表单提交:** AJAX(Asynchronous ...
《AngularJS——塑造之路》是针对JavaScript开发者的深入学习AngularJS框架的教程。AngularJS,由Google维护,是一款强大的前端JavaScript框架,它极大地简化了Web应用程序的开发,特别是在构建单页应用(SPA)方面...
8. **表单处理**:AngularJS提供了一套强大的表单验证机制,如`ng-required`、`ng-minlength`等,以及`ngSubmit`事件来处理表单提交。 9. **过滤器**:过滤器用于格式化数据,如日期、货币转换、排序等。它们可以在...
总结来说,Angular UI Validate是一个针对AngularJS的优秀扩展,它极大地增强了表单验证的能力,让开发者能更高效地构建具有复杂验证逻辑的前端项目。通过理解并熟练运用这个库,我们可以构建出更健壮、用户体验更佳...
10. 表单验证:AngularJS提供了内置的表单验证机制,可以轻松地对用户输入进行验证,如必填字段、电子邮件格式等。这些验证规则可以直接在HTML中定义,或者在控制器中定义。 总的来说,AngularJS通过其强大的特性,...
**AngularJS项目——软uni广告应用** AngularJS是一款由Google维护的前端JavaScript框架,用于构建单页应用程序(SPA,Single Page Applications)。这个“AngularJSproject”是一个基于AngularJS的实战项目,专注...
以下是一个简单的AngularJS应用示例,展示了如何使用数据绑定、表单验证和计算: ```html <!doctype html> <script src="http://code.angularjs.org/angular-1.1.0.min.js"> <script src="script.js"></script>...
4. **表单处理**:掌握表单验证和提交。AngularJS的ng-form和ng-model指令可以方便地实现表单的双向绑定和验证。ng-submit可以监听表单的提交事件。 5. **路由管理**:使用AngularJS的$routeProvider来定义不同URL...
9. **表单验证(Form Validation)**:AngularJS提供了内置的表单验证功能,例如`ng-minlength`、`ng-maxlength`等,确保用户输入的数据符合预期格式。 10. **过滤器(Filters)**:过滤器用于转换数据,如排序、...
8. **表单处理(Form Handling)**:AngularJS提供了丰富的表单处理功能,如表单验证、数据提交等。在AngularJS_tuto8中,你可以看到如何利用`ngForm`和`ngModel`处理表单数据,并实现验证逻辑。 9. **过滤器...
AngularJS内置了强大的表单验证机制,能够实时检查输入的有效性,提供良好的用户体验。在"eggly"的书签添加和编辑界面,可能会使用`ng-model`结合各种验证指令(如`ng-required`,`ng-minlength`等)来确保用户输入...
8. **表单验证(Form Validation)**:AngularJS提供了内置的表单验证机制,可以在客户端进行输入验证,提供即时反馈,提高用户体验。 9. **测试支持**:AngularJS鼓励测试驱动开发,提供了诸如ngMock和Protractor...