0

Я создаю директиву удаленной проверки, которая позволяет мне проверять с моим сервером, если поле проверено.Как создать директиву для проверки формы удаленно?

До сих пор у меня есть это:

angular.module('Form').directive('remoteFieldValidation', function (Query) { 
     return { 
      restrict: 'A', 
      scope: { 
       fieldValue: '=ngModel' 
      }, 
      link: function (scope, element, attr) { 
       element.parent().addClass('has-feedback'); 
       element.focusout(function (value) { 
        var value = scope.fieldValue; 
        var checker = attr.remoteFieldValidation; 
        if (value && checker) { 
         element.parent().append('<span class="form-control-feedback fa fa-spinner fa-spin" style="line-height: 35px"></span>'); 
         Query.api2({ 
          method: 'GET', 
          route: 'validateField', 
          params: { 
           value: value, 
           checker: checker 
          } 
         }).then(function (result) { 
         }) 
        } 
        else { 
         console.log('Missing checker or value'); 
        } 
       }) 
      } 
     } 
    }); 

Для оформления запроса моя собственная служба API в основном контролирует $http requests.

Теперь, когда я добавляю эту директиву атрибута в поле ввода, я хотел бы убедиться, что как только он начнет проверку, он устанавливает форму как недействительную.

Однако я не совсем уверен, как достичь формы из этой директивы.

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

+1

Вы можете прочитать о том, как реализовать асинхронную валидатор здесь: http://jaysoo.ca/2014/10/14/async-form-errors-and-messages-in- angularjs/ – Icycool

ответ

2

Вы можете сделать это статическим способом, просто сделав свое действие отправки, подождите, пока сервер проверит ваше поле. Однако лучшим подходом было бы добавление $asyncValidator на ваш ngModel. Это функция, выпущенная в выпуске AngularJs 1.3.

С помощью этого решения вы сможете поймать ошибки проверки с помощью угловых форм atributes:

<div ng-show="form.myField.$error.myRemoteValidator">The value is not valid!</div> 

Или используя ngMessages так:

<div ng-messages="form.myField.$error"> 
    <div ng-message="myRemoteValidator">The value is not valid!</div> 
</div> 

Ваши директивы будет выглядеть:

angular.module('Form') 
    .directive('remoteFieldValidation', function(Query, $q) { 
     return { 
     restrict: 'A', 
     require: 'ngModel', 
     link: function(scope, element, attr, ngModelCtrl) { 
      ngModelCtrl.$asyncValidators 
      .myRemoteValidator = function(modelValue, viewValue) { 
       var value = modelValue || viewValue; 
       var checker = attr.remoteFieldValidation; 

       return Query.api2({ 
       method: 'GET', 
       route: 'validateField', 
       params: { 
        value: value, 
        checker: checker 
       } 
       }).then(function(result) { 
       if (result.isValid) { 
        // it says to validator that it's valid 
        return true; 
       } else { 
        // it says to validator that it's not valid 
        // and also send the error message 
        return $q.reject('Invalid field'); 
       } 
       }, $q.reject); // invalidate in case of any errors on your api or request 
      }; 
     } 
     } 
    }); 

ОБНОВЛЕНИЕ

Пример:

<form name="form"> 
    ... 
    <input type="text" ng-model="myField" remote-field-validation> 
    <div ng-messages="form.myField.$error"> 
     <div ng-message="myRemoteValidator">The value is not valid!</div> 
    </div> 
    ... 
    <button ng-disabled="form.$invalid">Save</button> 
</form> 
+0

где бы я поставил свою директиву? на каком поле? –

+0

Вы должны добавить его в поле с 'ngModel', которое необходимо проверить. Я использовал псевдоним для поля, называемого 'myField', но вы получили эту идею и используете свои собственные, просто убедитесь, что она находится на ngModel, потому что $ asyncValidator поступает из контроллера ngModel. –

+0

спасибо, но где я могу положить ngMessage? что в той же директиве или на отдельном блоке div? –

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