跳过$ asyncValidators直到模型变脏

时间:2016-04-06 19:05:07

标签: angularjs

我使用$asyncValidators来验证字段值。使用$resource从服务器获取字段值。在页面加载时,该值为空,验证器向服务器发送请求。当$resource获取资源时,将填充字段值,验证程序会向服务器发送另一个请求。

我想跳过这两个初始请求,因为它们没用。我该怎么做?

我的输入字段:

<input name="name" class="form-control" ng-model="user.name" validate-name>

我的指示:

angular.module('myapp').directive('validateName', function($http, $q) {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
      ctrl.$asyncValidators.name = function(modelValue, viewValue) {
        return $http.post('/validate-username', {username: viewValue}).then(function(response) {
          if (!response.data.validUsername) {
            return $q.reject(response.data.errorMessage);
          }
          return true;
        });
      };
    }
  };
});

1 个答案:

答案 0 :(得分:1)

合理的条件是触摸模型;如果不是,只需返回已解决的承诺,而无需访问服务器。即:

ctrl.$asyncValidators.name = function(modelValue, viewValue) {
    if( ctrl.$touched ) {
        return $http.post('/validate-username', {username: viewValue})....
    }
    else {
        return $q.resolve(true);
    }
};