angularjs - 针对 angularjs 中的数组长度的自定义验证器

标签 angularjs angularjs-directive

我正在尝试编写一个自定义验证器require-items,它将根据范围内数组的长度为input表单字段生成有效/无效...在本例中skillTags

<input
    type="text"
    name="tags"
    ng-model="newTag"
    class="form-control"
    placeholder="Enter tags: (eg. JavaScript, HTML5)"
    ng-keyup="search($event)"
    ng-focus="search($event)"
    ng-class="{ 'has-results': matches.length }"
    require-items="{{skillTags.length}}"
    mongoose-error>



//custom validator not working
'use strict';

angular.module('offsiteApp')
    .directive('requireItems', function (){
        return {
            require: 'ngModel',
            link: function(scope, elem, attr, ngModel) {
                var len = parseInt(attr.requireItems);

                //For DOM -> model validation
                ngModel.$parsers.unshift(function(value) {
                    var valid = len ? true : false;

                    ngModel.$setValidity('require-items', valid);
                    return valid ? value : undefined;
                });

                //For model -> DOM validation
                ngModel.$formatters.unshift(function(value) {
                    var valid = len ? true : false;

                    ngModel.$setValidity('require-items', valid);
                    return value;
                });
            }
        };
    });



<p class="help"
   ng-show="form.tags.$error['require-items'] && submitted">
    Skill tags are required.
</p>

最佳答案

我从来没见过$formatters$parsers用于验证。据我所知,它们只能用于它们的名称。

通常,要验证,您需要连接到 $validators - 这将在模型或 View 值发生变化时运行。

但是在您的示例中,您的验证甚至不依赖于输入 - 所以我想知道为什么您甚至会在这里使用验证。

无论如何,由于你不关心输入,所以你只需要观察属性值和$setValidity的变化即可。因此:

.directive("requireItems", function(){
  return {
    require: "?ngModel",
    link: function(scope, element, attrs, ngModel){
      if (!ngModel) return;

      attrs.$observe("requireItems", function(){
        var val = parseInt(attrs.requireItems);
        ngModel.$setValidity("require-items", !!val);
      });
    }
  }
});

关于angularjs - 针对 angularjs 中的数组长度的自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531530/

相关文章:

angularjs - 为什么 ng-hide 不适用于自定义指令?

javascript - 在 d3.js 生成的新元素中获取 Angular 以执行 ng-if

javascript - ngTouch ngClick 不冒泡

angularjs - 为什么我必须在这里调用 $scope.$digest() ?

java - 如何克服 Angular JS 的 CORS 问题

angularjs - 绑定(bind)到 Controller 的指令 : data, 中的 Angular.js bindToController 不能用作 this.foo?

javascript - 尝试在指令中访问 $modelValue 时未定义

angularjs - 使用angularjs的补丁请求

javascript - 将 Flash 消息与 Angular Routing 结合使用

javascript - Angularjs 在 angular.forEach 中附加值