如何为angularjs中的所有控制器编写泛型方法?

时间:2014-02-09 14:07:33

标签: angularjs

我尝试从代码复制中清除我的项目,并想知道我是否可以减少跟随逻辑。

我有goolge maps作为指令和指令通知控制器一些事件。

此方法验证我们是否在摘要周期中运行并分别返回true/false

var isScopeInCycle = function(){
      return $scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest';
  }

但是我很有兴趣在几个控制器中使用这个方法。

我想把它投入使用但服务是单身,我不能在那里使用$scope

以下是示例:

控制器

 ....

 var isScopeInCycle = function(){
      return $scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest';
  }


$scope.zoomChanged = function(){ 
            if (isScopeInCycle()) {
                $scope.$apply(function(){
                   /* .. */;                    
                });
            }            
        }

        $scope.idle = function(){ 
            if (isScopeInCycle()) {
                $scope.$apply(function(){
                    /* .. */;   
                });
            }            
        }

有什么建议吗?

谢谢,

2 个答案:

答案 0 :(得分:3)

您可以在服务中使用$rootScope

module.factory('utils', ['$rootScope', function ($rootScope) {
    return {
        isScopeInCycle: function () {
            return $rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest';
        }
    };
});

然后在你的控制器中注入utils

module.controller('MyCtrl', ['$scope', 'utils', function ($scope, utils) {
    $scope.zoomChanged = function(){ 
        if (utils.isScopeInCycle()) {
            $scope.$apply(function(){
               /* .. */;                    
            });
        }            
    }
}]);

如果您想要删除更多的代码重复,也可以将$scope.$apply代码放在服务中。

答案 1 :(得分:2)

您有几种方法可以实现这一目标。 一种方法是使用run方法将此方法添加到$ rootScope:

angular.module('myApp').run(function($rootScope) {
    $rootScope.isScopeInCycle = function() { 
        return $rootScope.$$phase != '$apply' && $rootScope.$$phase != '$digest';
    }
});

另一种方法是使用您在原始帖子中编写的服务,但将$ scope作为参数传递给函数。

var isScopeInCycle = function($scope){
    return $scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest';
}

...
$scope.zoomChanged = function(){ 
    if (isScopeInCycle($scope)) {
        $scope.$apply(function(){
            /* .. */;                    
        });
    }            
}