2014-05-24 25 views
4

在所有的教程和例子我读过关于Angularjs,它们都定义了一个空列表作为第二个参数模块:在Angular中,是否有理由不使用模块声明列出模块依赖关系?

angular.module('myModule', []); 

据我所知,第二个参数的存在,需要创建一个新的模块,但我不明白为什么列表中没有任何元素。 angular.module的文档没有说明列表的内容将代表什么内容。

但是,从定义我的应用程序模块,我明白该列表代表了新模块所依赖的模块 - 为什么它总是为应用程序子模块清空?例如,在我自己的项目,我已经有了一个用户模块在其中我的应用程序取决于:

/* app.js */ 
angular.module('myApp', [ 
    'ngCookies', 
    'ngResource', 
    'ui.bootstrap', 
    'ui.router', 
    'myApp.system', 
    'myApp.users' 
]); 

angular.module('myApp.system', []); 
angular.module('myApp.users', []); 

当我终于可以学习如何使用单位人缘和茉莉的测试,我花了几个小时试图找出此错误消息:

Error: [$injector:modulerr] Failed to instantiate module myApp.users due to: 
Error: [$injector:unpr] Unknown provider: $stateProvider 
http://errors.angularjs.org/1.2.13/$injector/unpr?p0=%24stateProvider 
     at /Users/matt/Development/myApp/public/lib/angular/angular.js:3556 
     at getService (/Users/matt/Development/myApp/public/lib/angular/angular.js:3683) 
     at invoke (/Users/matt/Development/myApp/public/lib/angular/angular.js:3710) 
     at /Users/matt/myApp/public/lib/angular/angular.js:3639 

最后,我发现两件事情会解决这个问题 - 无论是我可以加载模块依赖于测试代码,或者我可以依赖,加入到在用户模块声明空单:

/* UserControllerTest.js */ 
describe('UserCtrl', function() { 

    var $rootScope, 
     $scope, 
     controller; 

    beforeEach(function() { 
     module('ui.router'); 
     module('myApp.system'); 
     module('ngResource'); 
     module('myApp.users'); 

     inject(function ($injector) { 
      $rootScope = $injector.get('$rootScope'); 
      $scope = $rootScope.$new(); 
      controller = $injector.get('$controller')('UserCtrl', {$scope: $scope}); 
     }); 
    }); 

    it('should work', function() { 
     expect(true).toBe(true); 
    }); 

}); 

或者:

/* app.js */ 
... 
angular.module('myApp.users', [ 
    'ngResource', 
    'ui.router', 
    'mean.system' 
]); 

是有一些原因,我不想做后者?为什么我从来没有在文档和教程中看到它 - 它会阻止我在测试中嘲笑这些依赖关系?

为什么我不需要后者的子模块定义来定期操作我的应用程序?我确实有一系列为UserCtrl指定的“注入本地” - 为什么单元测试还不够?

+1

第二种方法对我更有意义,这是我在我的代码中所做的。你明确地告诉谁在你之后使用这些代码,这些是这个模块的依赖关系。这使代码更清晰一些。 – Sobieck

+0

@ Sobieck00可能是我见过的例子很琐碎,它们的模块没有依赖关系吗? – Matt

+0

它可能是,但我真的不知道社区中的其他人在做什么。我会尝试在明天挖掘并用示例回答这个问题......如果我有时间...... – Sobieck

回答

3

模块的目的是封装自包含的代码部分(例如可重用的小部件,代码tgst实现特定的功能等)。一般来说,让每个模块声明它依赖的依赖关系是一个好习惯。

如果不是,那么模块依赖于要求它声明这些依赖关系的模块,这种依赖关系混淆了“自我控制”,损害了可测试性和可重用性,并且引入了一些潜在的未来错误。

也就是说,似乎没有理由不声明每个模块的依赖关系。 (不,它不会阻止你嘲笑单元测试中的依赖关系。)正如人们所期望的那样,每个模块都被加载一次,即使需要多个模块也是如此。

API参考确实不是非常详细的关于angular.module,但Developer Guide有一个更广泛的描述。

例如,在“相关性”部分报价:

模块可以列出其他模块的依赖关系。取决于模块意味着需要的模块需要在加载需求模块之前加载。换句话说,所需模块的配置块在需求模块的配置块之前执行。运行块也是如此。即使多个其他模块需要它,每个模块也只能加载一次

+0

正如我所怀疑的,我读过的示例和教程不足以具有模块的依赖关系(或者很小足以让他们在没有列出他们的情况下逃脱,因为偶然他们已经被加载。) – Matt