我目前收到常见的“$digest 已在进行中”错误消息。
有没有一种解决方案可以让我不需要使用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>
最佳答案
在手动启动周期之前,您可以使用$scope.$$phase
检查它是否正在进行。当$scope.$$phase没有设置时,可以安全地使用$apply
:
scope.$watch(attr.ngModel, function(value) {
$http.get('http://tagsy.co/api/username?token=' + apiToken + '&username=' + value).success(function(data) {
if(!scope.$$phase)
scope.$apply(function(s) {
ctrl.$setValidity('uniqueUsername', data.unique);
});
else
ctrl.$setValidity('uniqueUsername', data.unique);
});
}
您可以重构以避免代码冗余或创建一个帮助程序,例如:
function safeApply($scope, applyFn) {
if(!$scope.$$phase) $scope.$apply(applyFn)
else applyFn();
}
scope.$watch(attr.ngModel, function(value) {
$http.get('http://tagsy.co/api/username?token=' + apiToken + '&username=' + value).success(function(data) {
safeApply(scope, function() {
ctrl.$setValidity('uniqueUsername', data.unique);
});
});
}
编辑:这并不是说您应该在这种情况下这样做,因为 $http (和大多数 Angular 服务)会为您处理这个问题。
关于javascript - $digest 已经在进行中 - AngularJS 中的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18316877/