javascript - $digest 已经在进行中 - AngularJS 中的指令

标签 javascript ajax angularjs

我目前收到常见的“$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/

相关文章:

javascript - Context API react 功能组件

PHP 查询无法检查数据库中的用户名

AngularJS,ng-click与ng :click vs ngClick

javascript - 查找下一个可被 4 整除的元素

javascript - 如何使用 razor 语法中的 javascript 预加载图像?

javascript - 测试一个点是否与 Canvas 上的一个字符重叠

PhP session 不使用 AJAX 刷新

javascript - 我可以通过 beforeSend 事件更改 jQuery.ajax 的函数调用参数(在数据中发送)吗?

angularjs - ionic - ionic View 标题不起作用

JavaScript - ui-select 和对象