【发布时间】:2013-08-19 14:54:11
【问题描述】:
我目前收到常见的“$digest already in progress”错误消息。
是否有不需要使用 scope.$apply 的解决方案?
感谢您的帮助!
directive('ngUsername', ['$http', function($http) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elm, attr, ctrl) {
//when the scope changes, check the email.
scope.$watch(attr.ngModel, function(value) {
$http.get('http://tagsy.co/api/username?token=' + apiToken + '&username=' + value).success(function(data) {
scope.$apply(function(s) {
ctrl.$setValidity('uniqueUsername', data.unique);
});
});
});
}
}
}]);
<input type="text" name="username" ng-model="username" placeholder="Username" ng-minlength="3" ng-maxlength="15" ng-pattern="/^[A-Za-z0-9]+$/" autocomplete="off" ng-username required/>
<div ng-show="registerForm.username.$dirty && registerForm.username.$invalid">
<span class="error" ng-show="registerForm.username.$error.required">Please choose a username.</span>
<span class="error" ng-show="registerForm.username.$error.minlength">Username is too short.</span>
<span class="error" ng-show="registerForm.username.$error.maxlength">Username is too long.</span>
<span class="error" ng-show="registerForm.username.$error.pattern">Username can only be letters and numbers.</span>
<span class="error" ng-show="registerForm.username.$error.uniqueUsername">Username is already taken.</span>
</div>
【问题讨论】:
-
你能详细说明你想要什么吗?从代码中扣除
$http.get()返回的内容并不容易 -
在调用
$http服务后,您不需要$apply。 -
@sza 由于 $http 是异步的,它在 $watch 中被调用的事实并不能保证在完成和
success回调的时间之后循环将在进行中。真的要靠 $http 服务来触发循环。 -
谢谢。那么如果我不需要使用scope.$apply,我该如何设置validity选项呢?
标签: javascript ajax angularjs