2015-01-07 2 views
3

Я попробовал этот код:Возможно ли иметь более одного пользовательского валидатора на угловом поле?

.directive('uniqueUsername', function (isUsernameAvailable) { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function (scope, element, attrs, ngModel) { 
       ngModel.$asyncValidators.uniqueName = isUsernameAvailable; 
      } 
     }; 
    }) 
    .directive("isMinSix", function() { 
     return { 
      restrict: "A", 
      require: "ngModel", 
      link: function (scope, element, attributes, ngModel) { 
       ngModel.$validators.isMinSix = function (modelValue) { 
        if (modelValue != null && modelValue.length < 6) { 
         return true; 
        } else { 
         return false; 
        } 
       } 
      } 
     } 
    }) 
    .factory('isUsernameAvailable', function (appConstant, $q, $http) { 
     return function (username) { 
      var deferred = $q.defer(); 
      var url = appConstant.baseUrl + '/api/user/existsByName'; 
      $http({ 
       url: url, 
       method: "PUT", 
       data: { 
        userName: username 
       } 
      }).then(function() { 
        // Found the user, therefore not unique. 
        deferred.reject("User name is taken"); 
       }, function() { 
        // User not found, therefore unique! 
        deferred.resolve(); 
       }); 
      return deferred.promise; 
     } 
    }) 

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

   <input class="inputField" 
         id="registerUserName" 
         name="registerUserName" 
         is-min-six 
         ng-model="aus.registerUserName" 
         ng-model-options="{ debounce: 3000 }" 
         ng-required="true" 
         placeholder="Username" 
         type="text" 
         unique-username 
         value="" /> 

Кто-нибудь есть какие-либо идеи, что я могу делать неправильно?

+1

http://stackoverflow.com/questions/19177732/what-is-the-difference-between-ng-if-and-ng-show-ng-hide –

+0

Посмотрите, как проверяется угловое обращение с ручками для того, чтобы частично катиться, но вы должны иметь возможность использовать его непосредственно в dom. –

+0

Проблема в том, что я хотел получить сообщение в заголовок значка и с помощью угловой проверки. Я не уверен, как это сделать. Надеюсь, кто-то может придумать пример. –

ответ

2

Возможно иметь несколько валидаторов, но асинхронные валидаторы будут выполняться только в том случае, если синхронные валидаторы прошли. Это можно найти в documentation и source code:

Кроме того, все асинхронные валидаторы будут работать только один раз все синхронные валидаторы прошли.

Это имеет смысл, поскольку асинхронные валидаторы, скорее всего, будут удаленными процедурами, которые были бы расточительными, если поле в любом случае недействительно. Конечно, возможно изменить исходный код, связанный выше, чтобы заставить его работать по-своему, что, как представляется, всегда запускает асинхронные валидаторы.

1

Согласно этому хорошему ресурсу http://www.yearofmoo.com/2014/09/taming-forms-in-angularjs-1-3.html

асинхронной валидации НЕ будет работать, если все предыдущие нормальные валидаторов (валидаторы, присутствующие внутри ngModel. $ Валидаторы) имеет пройден. Это ограничение позволяет разработчику (да вы) до не допускать, чтобы валидатор делал чрезмерные обратные вызовы, когда входные данные имени пользователя недействительны.

Кроме того, я запутался о директиве имени isMinSix, которая возвращает в силе, если modelValue.length < 6. Там построено в директивах MINLENGTH и MaxLength в Угловом.

Смежные вопросы