2016-07-13 2 views
0

Допустим, у нас есть пользовательский валидатор со входом в качестве значения атрибута.Проверка триггера при изменении области действия пользовательского валидатора

app.directive('inputRequired', function() { 
    return { 
     require: 'ngModel', 
     scope: { 
      inputRequired: '=' 
     }, 
     link: function(scope, elm, attrs, ctrl) { 
      ctrl.$validators.inputRequired = function(modelValue) { 
       return !(scope.inputRequired && ctrl.$isEmpty(modelValue)); 
      }; 
     } 
    }; 
}); 

В рамках мы определяем переменную и функцию для переключения значения переменной:

$scope.isRequired = false; 

$scope.toggle = function() { 
    $scope.isRequired = !$scope.isRequired; 
}; 

Затем мы создаем форму, где мы будем использовать собственный валидатор. Мы также добавляем кнопку для вызова функции переключения.

<form> 
    <input type="text" ng-model="someModel" input-required="isRequired"/> 
    <button ng-click="toggle()">toggle</button> 
</form> 

Как это должно работать? Когда форма загружается и область инициализируется, значение isRequired установлено на false. Поэтому поле ввода не требуется. Когда мы нажимаем на кнопку переключения, значение isRequired изменяется на true. Но! Проверка не запускается, хотя переменная в области проверки достоверности была изменена.

Важное примечание: это только пример. Я знаю директиву ng-required, которая реализует эту функциональность. Мне нужно общее решение для случаев, когда валидатор имеет вход и действительность поля, зависит от этого ввода. Если ввод изменен, поле должно быть проверено немедленно.

ответ

1

только что узнал решение: добавить Бодрствующего на сферу в функции связи и вызвать $ проверить, когда inputRequired изменения:

app.directive('inputRequired', function() { 
    return { 
     require: 'ngModel', 
     scope: { 
      inputRequired: '=' 
     }, 
     link: function(scope, elm, attrs, ctrl) { 
      ctrl.$validators.inputRequired = function(modelValue) { 
       return !(scope.inputRequired && ctrl.$isEmpty(modelValue)); 
      }; 

      scope.$watch("inputRequired", function() { 
       ctrl.$validate(); 
      }); 
     } 
    }; 
}); 
Смежные вопросы