2016-03-21 13 views
0

Ich habe Richtlinie, die ein asynchrones Validator ist:

// part of directive 
return { 
    restrict: 'A', 
    scope: { 
    edit: '=', 
    }, 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 

    // .bind because I am using es6 classes(so $http service is on `this`) 
    ngModel.$asyncValidators.uniqueCode = Service.checkCode.bind(Service); 
    } 
}; 

Ich möchte scope.edit zum .checkCode Methode zu übergeben (die HTTP-Aufruf an das Backend zu machen) und lösen/ablehnen Versprechen basiert auf den Antwortstatus und diese Variable.

Antwort

0

Ok, stellt sich heraus, ich kann nur Werte übergeben Methode zur Bedienung selbst:

ngModel.$asyncValidators.uniqueCode = function() { 
    return Service.checkCode(ngModel.$viewValue, scope.edit); 
}; 
0

Obwohl Sie die Antwort fand ich ein umfassendes Beispiel für Asynchron-Validierer bin Entsendung Ihre Testfall verwendet wird.

angular.module('myModule').directive('nameValidator', function($http, $q) { 
    return { 
     restrict: 'A', 
     require: 'ngModel', 
     scope: { 
      edit: '=', 
     }, 
     link: function(scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.uniqueCode = function() { 
       return $http.post('/checkFunc', {name: scope.edit}).then(
        function(response) { 
         if (!response.data.validUsername) { 
          //invalid case ..validation failed 
          return $q.reject(response.data.errorMessage); 
         } 
         return true; 
        } 
       ); 
      }; 
     } 
    }; 
}); 

diesen verwenden -

<input type="text" ng-model="username" required name-validator> 

Anderen Ansatz ohne direkten Umfang zu verwenden.

.directive('usernameValidator', function($q, $timeout) { 
        return { 
         require: 'ngModel', 
         link: function(scope, element, attrs, ngModel) { 
          ngModel.$asyncValidators.username = function(modelValue, viewValue) { 
           if (!viewValue) { 
            return $q.when(true); 
           } 
           var deferred = $q.defer(); 
           $timeout(function() { 
            // Faking actual server-side validity check with $http. 
            // Let's pretend our service is so popular all short username are already taken 
            if (viewValue && viewValue.length < 5) { 
             deferred.reject(); 
            } 

            deferred.resolve(); 
           }, 2000); 
           return deferred.promise; 
          }; 
         } 
        }; 
       });