Использование $ resource с $ asyncValidators в angularjs

0

Это то, что я написал, но угловатый продолжает жаловаться на $ asyncValidators, говорящие мне {}. Я не хочу работать с $ http или с $ q. Это ошибочный код, который я написал:

       .directive('checkEmail', ['toolBox', function(toolBox){
     return {
       require: 'ngModel',
       link: function(scope, element, attrs, ngModel){
           ngModel.$asyncValidators.emailExists = function(userEmail){
             var promise = toolBox.checkEmailExist(userEmail);
             return promise.get(function success(res){
                      return true;
                    }, function error(res){
                      return false;
                    });
           };
        }
     };
   }])

Кто-нибудь из вас работал с валидацией с $ resource? Где я ошибаюсь? toolBox.checkEmailExist(userEmail) происходит от службы, которая выглядит так:

angular.module('toolBoxService', ['ngResource'])
   .factory('toolBox', ['$resource','$log', function($resource, $log){
     var dataObj = {};

     dataObj.checkEmailExist = function(email){
           return $resource('api/users/email', {email: email});
       };

     return dataObj;
   }]);

и элемент формы выглядит

<!-- Email field -->
<div class="input-group">
  <span class="input-group-addon" id="userEmail">*</span>
  <label class="control-label" for="userEmailField"></label>
  <input class="form-control"
         name="userEmail"
         id="userEmailField"
         required=""
         placeholder="Email"
         type="email"
         ng-model="data.email"
         ng-model-options="{ debounce: { default : 300, blur: 0 }}"
         check-email>
         </input>
</div>
<!-- Validation of the email -->
<div class="help-block form-error-messages"
     ng-messages="registerForm.userEmail.$error"
     ng-show="registerForm.userEmail.$touched"
     role="alert"
     ng-messages-multiple>
  <div ng-messages-include="FACETS/errors/errorMessages.html"></div>
</div>
Теги:
resources
asynchronous

3 ответа

2

Единственное решение, с которым я столкнулся, - это

// checking for email in the database
.directive('checkEmail', ['toolBox', function(toolBox) {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) {
      ngModel.$validators.checkEmail = function(modelValue, viewValue){
        var currentVal = modelValue || viewValue;
        toolBox.checkEmailExist(currentVal)
                             .get(function success(resp){
                               if(resp.email == currentVal) {
                                 ngModel.$setValidity('checkEmail', false);
                               } else {
                                 ngModel.$setValidity('checkEmail', true);
                               }
                             });
      };
    } // end link
  }; // end return
}])

$ resource не работает с $ asyncValidators, к сожалению. Приняли мне 2 дня, чтобы понять это. Надеюсь, был ответ, более экспертный голос по этому вопросу.

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

Я могу это решить, дело в том, чтобы немного поиграть с обещаниями

.directive('validateNbr',['$q','PreavisoService', function($q, PreavisoService) {
    return {
        require: 'ngModel',
        restrict: '',
        link: function(scope, elm, attrs, ngModel) {
            ngModel.$asyncValidators.validateNbr = function(modelValue){
                var def = $q.defer();
                PreavisoService.checkUnitDigit({nbr:ngModel.$viewValue}).$promise.then(
                        function(result){
                            if(result.isValid === false){
                                def.reject();
                            }else{
                                def.resolve();
                            }
                        });

                return def.promise;
            };
        }
    };
}]);

Надеюсь, поможет

0

Возможно, вам нужно вернуть $ prom, привязанный к объекту экземпляра ресурса, а не самому объекту.

Если ваш api возвращает ответ OK 200, когда имя пользователя существует и состояние ошибки (например, 404 не найдено), когда это не так, работает следующий подход:

.directive('usernameExists', ['$resource', function ($resource) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, elem, attrs, ngModel) {

            ngModel.$asyncValidators.usernameExists = function (userName) {
                return $resource('/api/Account/:userName')
                        .get({ userName: userName }).$promise;
            };
        }
    }
}])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню