在一个事件中调用两个东西时的角度误差[$ rootScope:inprog]

时间:2017-09-20 10:20:13

标签: angularjs

$scope.createAccount = "Create Account";
$scope.isDisabled = false;

$scope.createUser = function(account){
     user.createAccount(account);
     $scope.createAccount = 'Creating Account...';
     $scope.isDisabled = true;
};
  

[$ rootScope:inprog] http://errors.angularjs.org/1.4.4/ $ rootScope / inprog?p0 =%24dgest at angular.js:38

如果我发表评论

$scope.createAccount = 'Creating Account...';
$scope.isDisabled = true;

它没有错误,请提出什么问题

在使用中我使用此功能

function rootScoopApply($scope, fn)
    {
         var phase = $scope.$root.$$phase;
         if (phase == '$apply' || phase == '$digest') {
             if (fn && typeof fn === 'function') {
                 fn();
             }
         } else {
             $scope.$apply(fn);
         }  
    }

并将其命名为

user.rootScoopApply($rootScope, function() {        
    $scope.createUser = function(account){

         user.createAccount(account);
         $scope.createAccount = 'Creating Account...';
         $scope.isDisabled = true;

    }

  }); 

1 个答案:

答案 0 :(得分:0)

AngularJS为常见的本机JS异步行为提供包装器:

  • Events => ng-click
  • 超时=> $ timeout
  • jQuery.ajax()=> $ HTTP

这只是一个传统的异步函数,最后调用了$scope.$apply(),告诉AngularJS刚刚发生异步事件。

$scope.$apply()应尽可能接近异步事件绑定。

请勿在整个代码中随意撒上。如果你在做 if (!$scope.$$phase) $scope.$apply()这是因为你在调用堆栈中不够高。

尽可能使用AngularJS服务而不是本机服务。如果您正在创建一个AngularJS服务(例如套接字),它应该在$scope.$apply()触发回调或广播/发射的任何地方。

例如,$rootScope.$apply($rootScope.$broadcast('receivedMsg', msg)); is valid

source