角度控制器全局与闭包

时间:2014-05-21 19:43:22

标签: javascript angularjs

这个问题让我很生气。

测试代码:

describe('controller', function(){
   module('controllers');
   var createCtrl;
   beforeEach(inject(function($injector){

    $rootScope = $injector.get('$rootScope');
    var $controller = $injector.get('$controller');
    createCtrl = function(){
     return $controller('controller', {
       $scope: $rootScope
     });
  }));
  it('should create a controller', function(){
    var ctrl = createCtrl();
  });
});

如果i控制器功能在全局范围内定义,则可行。例如

angular.module('controllers', [])
   .controller('controller', ['$scope', controller]);
 function controller($scope){}

但是如果我将函数本身移动到数组中,或者将模块代码包装在闭包中(在这些中的任意组合中):

(function(angular){
  angular.module('controllers', [])
  .controller('controller', ['$scope', function($scope){}]);
})(angular);

测试开始抛出此错误 Error: [ng:areq] Argument 'controller' is not a function, got undefined

有什么想法吗?我真的需要这个控制器不要污染全球范围。

1 个答案:

答案 0 :(得分:2)

首先,您需要修复语法问题。分配给createCtrl的函数缺少一个结束的大括号。

要解决您的实际问题,您需要包含角度模拟并替换

module('controllers');

beforeEach(angular.mock.module('controllers'));

将函数本身移动到数组中似乎完全有效,我个人一直使用这种语法。将它们包装在闭包中似乎是不必要的,因为你没有暴露任何变量。

我还建议不要将$ rootScope用作当前的$ scope。而是使用$rootScope.$new()