延迟angularjs中的异步验证器

时间:2015-08-21 09:59:47

标签: angularjs validation asynchronous

我有以下指令:

.directive('validateAsync',
  ['$http', 'API_LOCATION', function($http, API_LOCATION) {

  return {
    require : 'ngModel',
    link : function(scope, element, attrs, ngModel) {
      var apiUrl = attrs.validateAsync;

      function setAsLoading(bool) {
        ngModel.$setValidity('asyncLoading', !bool); 
      }

      function setAsAvailable(bool) {
        ngModel.$setValidity('asyncAvailable', bool); 
      }

      ngModel.$parsers.push(function(value) {
        if(!value || value.length == 0) return;

        setAsLoading(true);
        setAsAvailable(false);

        $http.get(API_LOCATION + apiUrl, { 
          params: {
            value : value 
          }
        })
        .success(function() {
          setAsLoading(false);
          setAsAvailable(true);
        })
        .error(function() {
          setAsLoading(false);
          setAsAvailable(false);
        });

        return value;
      })
    }
  }
}]);

这就是这样称呼的:

<input ... validate-async="api/endpoint/to/check/validity">

效果很好,实际上太棒了。因为每个keydown都会发出请求。

如何在验证输入之前使指令等待300 ms,或者在input blur上激活验证?

更新

虽然比我容易: 添加ng-model-options="{ debounce: 300 }"就可以了。

感谢JB Nizet引导我找到正确答案

1 个答案:

答案 0 :(得分:2)

这比我更容易:添加ng-model-options =“{debounce:300}”就可以了。