2015-06-26 3 views
0

Я использую директиву для создания пользовательского валидатора, и он отлично работает. Но это было вызвано только один раз! Если мои «roleItems» обновляются, эта директива не была вызвана снова! Как это можно вызвать каждый раз, когда обновляются «roleItems»?угловая директива была вызвана только

Вот наценки. И «Не-пустой» - моя директива.

<form name="projectEditor">  
    <ul name="roles" ng-model="project.roleItems" not-empty> 
     <li ng-repeat="role in project.roleItems"><span>{{role.label}}</span> </li> 
     <span ng-show="projectEditor.roles.$error.notEmpty">At least one role!</span> 
     </ul> 
    </form> 

Это моя директива. Он должен проверить, являются ли ng-model "roleItems" пустыми.

angular.module("myApp", []). 
    directive('notEmpty', function() { 
     return { 
      require: 'ngModel', 
      link: function (scope, elm, attrs, ctrl) { 

       ctrl.$validators.notEmpty = function (modelValue, viewValue) { 


        if(!modelValue.length){ 
         return false; 
        } 

        return true; 
       }; 

      } 
     }; 
    }); 
+1

Что вы намерены использовать для модели ng? ng-model используется для привязки двунаправленных данных на таких компонентах, как входы, где пользователь может вводить значения, которые хранятся в модельной переменной. ul не может этого сделать. Это не имеет никакого смысла. Просто удалите эту директиву и используйте

ответ

0

Главная цель валидатор проверить значение ngModel пользовательского ввода или изменения модели, поэтому она должна быть Uset к CheckBox/textara/вход и т.д. Вы косяк Validate нг-модель все. Угловая достаточно умная, чтобы знать, что ng-модель не имеет никакого чувства, поэтому он просто игнорирует ее.

Я хочу изменить только сообщение об ошибке, которое вы можете проверить через свойство .length. Если вы хотите сделать всю форму недействительной, я предлагаю вам создать настраиваемую директиву, надеть ее, а затем в валидатор этой контрольной проверки scope.number.length> 0

В основном просто настройте свой директивный код на элемент ввода и скройте он .... через css или type = hidden, но не делает ngModel = «значение», это не имеет смысла, потому что ng-модель ожидает значения, которое может быть привязано и перезаписано, но project.roleItems не является связываемым! поэтому поместите ng-model = "dummyModel" и фактические элементы в другой параметр ...

<input type="hidden" ng-model="dummyIgnoredModel" number="project.roleItems" check-empty> 


angular.module("myApp", []). 
    directive('checkEmpty', function() { 
     return { 
      require: 'ngModel', 
      link: function (scope, elm, attrs, ctrl) { 

       ctrl.$validators.push(function (modelValue, viewValue) { 


        if(!scope.number.length){ 
         return false; 
        } 

        return true; 
       }); 
      //now we must "touch" ngModel 
       scope.$watch(function() 
       { 
        return scope.number 
       }, function() 
       { 
        ctrl.$setViewValue(scope.number.length); 
       }); 
      } 
     }; 
    }); 
Смежные вопросы