2

我正在尝试为输入字段构建一个指令,该指令使用从外部范围传递的自定义函数进行验证,例如:

HTML:

<input type="text" custom-validator="checkValidity"/>

控制器:

$scope.checkValidity = function(value){
    return $scope.invalidWords.indexOf(value) === -1;
}

我为此创建了一个详细的 plunker:http ://plnkr.co/edit/H5A5O3?p=preview

验证工作,但它似乎打破了默认指令,在这种情况下,ng-disabled 不起作用,我无法访问 ng-model 中使用的变量!

这是我的指令:

app.directive('customValidator', function() {   
   return {
      require: "ngModel"
    , scope: { customValidator: '='}
    , link: function postLink(scope, elm, attrs, ctrl) {
          var validator = function(value) {
            if(scope.customValidator && scope.customValidator(value)) {
              ctrl.$setValidity('custom-validator', true);
              return value;
            }
            ctrl.$setValidity('custom-validator', false);
            return undefined;
          }
          ctrl.$parsers.unshift(validator);
          ctrl.$formatters.unshift(validator);
        }      
   } 
});

我不知道出了什么问题,我真的需要帮助!

我应该继续使用 Angular 1.0.7

4

2 回答 2

4

ng-disabled不工作的原因inputB是您正在通过指令创建新范围:

scope: { customValidator: '=' }

要将模型保持inputB在与您相同的范围内,inputA您可以执行以下操作:

app.directive('customValidator', function() {
    return {
        require: "ngModel", 
        scope: false, 
        link: function postLink(scope, elm, attrs, ctrl) {
            var validator = function(value) {
                customValidator = scope[attrs["customValidator"]];  
                if(customValidator(value)) {
                    ctrl.$setValidity('custom-validator', true);
                    return value;
                }
                ctrl.$setValidity('custom-validator', false);
                return undefined;
            }
            ctrl.$parsers.unshift(validator);
            ctrl.$formatters.unshift(validator);
        }   
    }
});
于 2013-08-21T08:04:15.133 回答
3

ng-model 和隔离范围不能很好地混合,因此请遵循@Codezilla 的建议,不要创建新范围。

但是,我建议使用 $parse,它允许我们在 HTML 中清楚地指定我们正在将带有单个(命名)参数的函数传递给指令:

<input type="text" ... custom-validator="checkValidity(val)">

app.directive('customValidator', function($parse) {
    return {
        require: "ngModel", 
        //scope: false, 
        link: function postLink(scope, elm, attrs, ctrl) {
            var validationFn = $parse(attrs.customValidator);
            var validator = function(value) {
                if(validationFn(scope, {val: value})) {
                    ctrl.$setValidity('custom-validator', true);
                    return value;
                }
                ctrl.$setValidity('custom-validator', false);
                return undefined;
            }
            ctrl.$parsers.unshift(validator);
            ctrl.$formatters.unshift(validator);
        }   
    }
});

plunker

于 2013-08-21T14:10:06.160 回答