Page 52 - AngularJS权威教程
P. 52

32  第 7 章  过滤器


                 如果验证失败,这个属性的值为true;如果值为false,说明输入字段的值通过了验证。
                 10. 一些有用的CSS样式

                 AngularJS处理表单时,会根据表单当前的状态添加一些CSS类(例如当前是合法的、未发生
             变化的,等等),这些CSS类的命名和前面介绍的属性很相似。
                 它们包括:

                 .ng-pristine {}
                 .ng-dirty {}
                 .ng-valid {}
                 .ng-invalid {}
                 它们对应着表单输入字段的特定状态。

                 当某个字段中的输入非法时,.ng-invlid类会被添加到这个字段上。当前例子中的站点将
             对应的CSS样式设置为:

                 input.ng-invalid {
                   border: 1px solid red;
                 }
                 input.ng-valid {
                   border: 1px solid green;
                 }

                   $parsers
                 当用户同控制器进行交互,并且ngModelController中的$setViewValue()方法被调用时,
             $parsers数组中的函数会以流水线的形式被逐个调用。第一个$parse被调用后,执行结果会传
             递给第二个$parse,以此类推。

                 这些函数可以对输入值进行转换,或者通过$setValidity()函数设置表单的合法性。
                 使用$parsers数组是实现自定义验证的途径之一。例如,假设我们想要确保输入值在某两个
             数值之间,可以在$parsers数组中入栈一个新的函数,这个函数会在验证链中被调用。
                 每个$parser返回的值都会被传入下一个$parser中。当不希望数据模型发生更新时返回
             undefined。

                 angular.module('myApp')
                 .directive('oneToTen', function() {
                    return {
                      require: '?ngModel',
                      link: function(scope, ele, attrs, ngModel) {
                        if (!ngModel) return;
                          ngModel.$parsers.unshift(
                            function(viewValue) {
                              var i = parseInt(viewValue);

                              if (i >= 0 && i < 10) {
                                ngModel.$setValidity('oneToTen', true);
                                return viewValue;
                              } else {
                                  ngModel.$setValidity('oneToTen', false);
                                  return undefined;
                              }
   47   48   49   50   51   52   53   54   55   56   57