我尝试从代码复制中清除我的项目,并想知道我是否可以减少跟随逻辑。
我有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(){
/* .. */;
});
}
}
有什么建议吗?
谢谢,
答案 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(){
/* .. */;
});
}
}