<form name="form" novalidata>

  <label name="email">your email</label>
  <input type="email" name="email" ng-model="email" placeholder="Email Address">
</form>
 
/*如下是朋友空间的内容*/
 
angular 高级校验特性

在一些情况下,单独的表单验证并不能满足需要,可能有一些特殊的校验,比如关联两个数据等等.通常这类校验都是可复用的,也就是需要一个directive.编写的自定义校验的 directive 并不复杂,首先需要了解几个 Angular 提供的属性和接口.

1. $setValidity()

这个方法可以人为的设置一个表单控件的$valid 以及$ invalid, 也就是说改变表单控件是否通过校验的状态.类似的还有$setDirty()和$setPristine().

1
ngModel.$setValidity('max-custom'true);    // 类似这样的设置就将一个表单控件的状态改变了, ngModel 是 directive 的 link 的第四个参数,$setValidity 的第一个参数可以定义一个标志,第二个参数true 表示通过验证, false 表示未通过

2. $parsers

这个属性解释起来稍微有点抽象,当 ngModel 的值发生变化的时候,Angular 会自己调用 $setViewValue(value),然后 ngModel 的 $parsers 数组中得函数会被逐个调用,当 $parsers[0] 中的方法被调用后执行结果会传递给 $parsers[1],以此类推,这些函数可以对 ngModel 的值进行转换或者通过 $setValidity() 设置表单的合法性.

所以如果我们想实现点什么特殊的校验,可以在 $parsers 中插入一个 function, 然后它会在验证链中被调用,如果不希望数据模型发生更新,让 $parsers 的函数返回值返回 undefined 即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.directive('maxMax'function(){
  return {
    require: 'ngModel',
    restrict: 'A',
    link: function($scope, iElm, iAttrs, ngModel) {
      if(!ngModel) return;
      ngModel.$parsers.unshift(function(viewValue){
        var num = parseInt(viewValue);
        if(num>=0 && num<99){
          ngModel.$setValidity('maxMax',true);
          return viewValue;
        }else{
          ngModel.$setValidity('maxMax',false);
          return undefined;
        }
      });
    }
  };
})

红色字体部分经过我的实践及探索,发现有误,正确的应该如下:

所以如果我们想实现点什么特殊的校验,可以在 $parsers 中插入一个 function, 然后它会在验证链中被调用,如果不希望数据模型发生更新,让 $parsers 的函数返回值返回 原值 即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.directive('maxMax'function(){
  return {
    require: 'ngModel',
    restrict: 'A',
    link: function($scope, iElm, iAttrs, ngModel) {
      if(!ngModel) return;
      ngModel.$parsers.unshift(function(viewValue){
        var num = parseInt(viewValue);
        if(num>=0 && num<99){
          ngModel.$setValidity('maxMax',true);
          return viewValue;
        }else{
          ngModel.$setValidity('maxMax',false);
          return viewValue; // 这里如果返回 undefined 则会导致部分ng自带验证器失效,因为获取不到ngModel.$viewValue的值了。
        }
      });
    }
  };
})

最新文章

  1. NuGet学习笔记1——初识NuGet及快速安装使用
  2. PHP一句话过狗、卫士、D盾等免杀思路!
  3. [转]expect的安装
  4. 基于Java的WebSocket推送【转载】
  5. 【转】C++11 标准新特性: 右值引用与转移语义
  6. css 属性
  7. oracle的表空间
  8. AngularJs 入门系列-1 使用 AngularJs 搭建页面基本框架
  9. 数据挖掘相关的10个问题[ZZ]
  10. DDUI For Delphi Seattle Directui界面组件
  11. EF实体类配置总结
  12. C++迭代器 iterator【转】
  13. Ubuntu 16.04 安装系统监视器System Monitor
  14. elk的备份与恢复【转】
  15. adoop(四)HDFS集群详解
  16. Ubuntu-1604-LTS在虚拟机设置分辨率
  17. 使用FreeMarker生成word文档
  18. 第 16 章 C 预处理器和 C 库(可变参数:stdarg.h)
  19. 修改mysql的用户密码
  20. Java何时该使用覆盖?

热门文章

  1. opencv core组件进阶
  2. 1065 A+B and C
  3. 作业要求20160901 从edu.cnblogs.com中抄过来的,备忘
  4. M1阶段事后总结
  5. Linux内核设计与实现 第一章 第二章
  6. Linux内核设计(第一周)——从汇编语言出发理解计算机工作原理
  7. redisCluster数据持久化
  8. ElasticSearch5.6.1 + 中文分词(IK)
  9. react-router JS 控制路由跳转(转载)
  10. java8新特性(三)_Optional类的使用