在$ setValidity(True)之后,$ $有效状态未更新

时间:2014-01-18 10:06:46

标签: validation angularjs angular-ui

我正在使用ui-validate作为验证规则。

<input  ng-model=raw.expression 
        name="expression" 
        type="text"
        required
        ui-validate="{serversidevalid : 'validate_serverside($value)'}">

验证在服务器端执行,短版本......在控制器中执行

$scope.validate_serverside = function(expression) {

  someValidationFactory
   .validate(expression)
   .then(function(server_error_message) { 

      var validity = true, 
          error_message = false, 
          input = $scope.my_form['expression'];

      if (server_error_message !== undefined) {
        validity = false;
        error_message = server_error_message;
      }

      input.$setValidity('serversidevalid',validity);
      input.$error.serversidevalid = error_message;

  });

现在,在使用有效表达式执行此函数后 - 表单的状态有效,$ error键和消息都已被删除,但字段的$ valid / $ invalid仍然无效。

整个表单如何变得有效但字段​​保持无效?

我尝试用$scope.$apply包装最后两个语句或明确触发$scope.$digest(),但它会抛出“正在进行的摘要”。我尝试用$timeout包装事物以在完成摘要后执行 - 同样不希望的结果。

在这里感谢一些指导。

1 个答案:

答案 0 :(得分:0)

所以我在github上看到了这个讨论,在快速查看了我重新编写的代码之后,我在过去几个月ui-validate通过promises支持服务器端验证。

所以我删除了$setValidity的外部操作,并将我的验证更改为如下

$scope.validate_serverside = function(expression) {
  var deferred = $q.defer();

  someValidationFactory
   .validate(expression)
   .then(function(server_error_message) { 

      if (server_error_message !== undefined)
         deferred.reject(false)
      else 
         deferred.resolve(true)
  });

  return deferred.promise;
}