客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可以让你从一开始就写出一个具有交互性和可相应的现代HTML5表单。
@H_404_2@ 在AngularJS中,有许多表单验证指令。在这里,我们将谈谈几个最流行指令,然后我们将讨论如何编写自定义的验证。<form name="form"> label "email"Your email</labelinput type"email" ng-modelplaceholder"Email Address" /> form
novalidate
属性,这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。
@H_404_2@ 让我们来看看我们可以在input设置哪些验证:
必填
@H_404_2@ 验证是否已输入字符,只需在标签上加上required:"text"required
最小长度
@H_404_2@ 验证输入至少输入{number}个字符,使用AngularJS指令的ng-minlength=“{number}”:ng-minlength5 最大长度
@H_404_2@ 验证输入字符要小于等于{number}个字符,使用AngularJS指令的ng-maxlength=“{number}”:
ng-maxlength20 正则匹配
@H_404_2@ 要确保输入匹配一个正则表达式,使用AngularJS的指令@H_404_136@ng-pattern="/PATTERN/":
ng-pattern"/a-zA-Z/" Email
@H_404_2@ 验证输入字符是一个电子邮件地址,只需设定input的type属性为email,像这样:
"user.email" 数字
@H_404_2@ 验证输入字符是一个数字,同样只需设定number,像这样:
"number""user.age" Url
@H_404_2@ 验证输入字符是一个URL地址,同样只需设定url,像这样:
"url""homepage""user.facebook_url" 自定义验证
@H_404_2@ AngularJS可以很容易的使用指令来添加自定义验证。例如,我们要验证我们的用户名是可用的(在数据库中不重复)。要做到这一点,我们将实现一个指令,它在输入字符变化时触发一个Ajax请求:
@H_404_2@ 这些class对应着其对应的验证对象的结果。
@H_404_2@ 当一个字段是无效的,@H_404_136@.ng-invalid将被应用到这个字段上。我们可以通过css来设置这些class的样式:
var app = angular.module('validationExample',[]); app.directive('ensureUnique',['$http',function($http) { return { require: 'ngModel'(scope,ele,attrs,c) { scope.$watch(attrs.ngModel,() { $http({ method: 'POST''/api/check/' + attrs.ensureUnique,data: {'field': attrs.ensureUnique} }).success((data,status,headers,cfg) { c.$setValidity('unique''unique',51); font-weight:bold">false); }); }); } } }]);
验证表单状态
@H_404_2@ AngularJS将DOM验证的结果保存在$scope对象中。这使我们能够实时做出一些响应。提供给我们的属性有: @H_404_2@ 请注意,这是这个属性的格式:formName.inputFieldName.property
未修改过的表单
@H_404_2@ 布尔值属性,表示用户是否修改了表单。如果为ture,表示没有修改过;false表示修改过:formName.inputFieldName.$pristine;
修改的表单
@H_404_2@ 布尔型属性,当且仅当用户实际已经修改的表单。不管表单是否通过验证:$dirty
经过验证的表单
@H_404_2@ 布尔型属性,它指示表单是否通过验证。如果表单当前通过验证,他将为true:$valid
未通过验证的表单
@H_404_2@ 布尔型属性,它指示表单是否通过验证。如果表单当前没有通过验证,他将为true:$invalid
@H_404_2@ 最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,如果要设置特定的class时,他们也非常有用的。
错误
@H_404_2@ 另一个有用的属性是AngularJS提供给我们的$error对象。这个对象包含input的每一个验证是有效的还是无效的(一个集合)。为了访问这个属性,使用下面的语法:formName.inputfieldName.$error
@H_404_2@ 如果验证失败,则此属性将是true的,而如果它是false的,那么该值通过验证的。
无害的一些样式
@H_404_2@ 当AngularJS处理的表单验证时,它将根据验证的状态增加一些特定的class属性。这些class被命名为类似的属性,我们可以检查。.ng-pristine {} .ng-dirty {}.ng-valid {}.ng-invalid {}
input.ng-invalid { border: 1px solid red;
}
.ng-valid {1px solid green;
}
全部放在一起
@H_404_2@ 让我们编写一个注册表单。本申请表单将包括这个人的名字,他们的电子邮件,以及所需的用户名。 @H_404_2@ 让我们定义一个form表单:"signup_form"novalidate ng-submit"signupForm()"fieldset
legendSignup
button "submit"class"button radius"Submitbutton 这个表单的名字是@H_404_136@signup_form,当我们点击提交时我们将调用
signupForm()方法
.
@H_404_2@ 现在,让我们添加用户的Name属性:
div "row""large-12 columns"Your name"Name""name""signup.name"3 20 div 首先我想说明我使用了Foundation作为我的css框架,所以你将在代码中看到它的相关语法。 我们增加了一个名字为name的输入框,并且对象绑定在$scope对象的signup.name对象上(通过ng-model)。
@H_404_2@ 我们还设置了几个验证。这些验证分别是:我们必须有一个长度为3个或更多字符的名字。并且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,我们设置名称应该是必填的。
@H_404_2@ 当如果表单无效时,让我们用属性来控制显示还是隐藏错误列表。我们还将使用$dirty属性,以确保当用户没有输入字符前错误提示不显示:
"error"ng-show"signup_form.name.$dirty && signup_form.name.$invalid"small "signup_form.name.$error.required"
Your name is required.
small"signup_form.name.$error.minlength"
Your name is required to be at least 3 characters
"signup_form.name.$error.maxlength"
Your name cannot be longer than 20 characters
@H_404_2@ 让我们来看看接下来的验证,一个电子邮件:
"Email""signup.email""signup_form.email.$dirty && signup_form.email.$invalid"
"signup_form.email.$error.required"
Your email is required.
"signup_form.email.$error.minlength"
Your email is required to be at least 3 characters
"signup_form.email.$error.email"
That is not a valid email. Please input a valid email.
"signup_form.email.$error.maxlength"
Your email cannot be longer than 20 characters