我正在使用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
包装事物以在完成摘要后执行 - 同样不希望的结果。
在这里感谢一些指导。
答案 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;
}