2017-06-14 65 views
0

我做了以下指令:如何使用指令验证输入自定义?

.directive('checkValueTypeArray', function() { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     scope: { 
      typeElement: '=', 
      typeValue: '=' 
     }, 
     link: function (scope, element, attrs, ngModel) { 

      var type_value = scope.typeValue; 

      ngModel.$validators.required = function (v) { 

       switch (type_value) { 

        case "integer": 
         status = isInt(v); 
         break; 

        case "string": 
         status = isNaN(v); 
         break; 

        case "object": 
         status = true; 
         break; 

        case "array": 
        case "array_objects": 
         status = true; 
         break; 

        case "boolean": 
         status = (v === "true" || v === "false"); 
         break; 

        case "float": 
         status = isNumeric(v); 
         break; 

        case "vector2": 
         status = (v.length === 2); 
         break; 

        case "vector3": 
         status = (v.length === 3); 
         break; 
       } 

       return status; 
      }; 
     } 
    }; 
}) 

并调用这个指令类似如下:

<input 
    ng-required="true" 
    check-value-type-array 
    type-value="node.type_value" 
    type-element="node.type" 
    ng-value="item" 
    class="form-control" 
    ng-change="changeArrayValue(inputValue, $index, node, $parent.$index)" 
    ng-model="inputValue" type="text" 
    placeholder="Value ($$node.type_value$$)" 
> 

问题是,如果status假的,它没有输入字段错误(彩色)。

所以,它不适合我。当我看到DOM Chrome中的输入时,我看到了孤立的模型。

回答

0

我假设你需要添加一个$observe

看一看从angular.js源ngRequired指令:

var requiredDirective = function() { 
    return { 
    restrict: 'A', 
    require: '?ngModel', 
    link: function(scope, elm, attr, ctrl) { 
     if (!ctrl) return; 
     attr.required = true; // force truthy in case we are on non input element 

     ctrl.$validators.required = function(modelValue, viewValue) { 
     return !attr.required || !ctrl.$isEmpty(viewValue); 
     }; 

     attr.$observe('required', function() { 
     ctrl.$validate(); 
     }); 
    } 
    }; 
};