@xiaoqq
2016-08-29T12:08:25.000000Z
字数 2454
阅读 1619
AngularJS
required: 必填项ng-minlength\ng-maxlength: 最小\最大长度ng-pattern: 模式匹配type="email": 验证电子邮件type="number": 验证数字type="url": 验证Url在表单元素上添加novalidate标记即可,问题是我们怎么知道我们的表单有哪些字段是有效的,那些事非法或者无效的?ng对此也提供了非常棒的解决方案,表单的属性可以在其所属的$scope对象中访问到,而我们又可以访问$scope对象,因此JavaScript可以间接地访问DOM中的表单属性。借助这些属性,我们可以对表单做出实时响应。
可以使用formName.inputFieldName.property的格式访问这些属性。
| Property | Class | Description |
|---|---|---|
| $valid | ng-valid | {Boolean}当验证规则通过时为true |
| $invalid | ng-invalid | {Boolean}当验证规则不通过时为true |
| $pristine | ng-pristine | {Boolean}当输入元素没被填写过 |
| $dirty | ng-dirty | {Boolean}当输入元素被填写过 |
| $error | 它包含当前表单的所有验证内容,以及它们是否合法的信息 |
使用示例:
<form role="form" name="myForm" ng-submit="submitForm(myForm.$valid)" novalidate><div ><div class="col-md-4"><label for="name">1.必填项</label></div><div class="col-md-8"><input class="form-control" id="name" name="name" type="text" required ng-model='user.name' /><span ng-show="myForm.name.$dirty && myForm.name.$valid"></span></div></div></form>
自定义对个email验证的指令:
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);}};}])
<form class="form-horizontal" role="form" id="custom_form" name="custom_form" novalidate><div class="form-group"><label class="col-sm-2 control-label">多个email</label><div class="col-sm-10"><input multiple-email name="user_email" ng-model="user.email" required class="form-control" placeholder="自定义验证,多个邮箱地址,以“;”或者“;”分割" />验证通过:{{custom_form.user_email.$valid}}</div></div><div class="form-group text-center"><input class="btn btn-primary btn-lg" ng-disabled="custom_form.$invalid" type="submit" value="提交" /></div></form>
涉及知识点:
$setViewValue()方法被调用时,其中的函数在当用户同控制器进行交互,并且ngModelController中的$setViewValue()方法被调会以流水线的形式被逐一调用。ngModel从DOM中读取的值会被传入$parsers中的函数,并依次被其中的解析器处理。这是为了对值进行处理和修饰。$parser流水线互不影响,用来对值进行格式化和转换,以便在绑定了这个值的控件中显示。$viewChangeListeners,可以在无需使用$watch的情况下实现类似的行为。由于返回值会被忽略,因此这些函数不需要返回值。


