在所有的教程和例子我读过关于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指定的“注入本地” - 为什么单元测试还不够?
第二种方法对我更有意义,这是我在我的代码中所做的。你明确地告诉谁在你之后使用这些代码,这些是这个模块的依赖关系。这使代码更清晰一些。 – Sobieck
@ Sobieck00可能是我见过的例子很琐碎,它们的模块没有依赖关系吗? – Matt
它可能是,但我真的不知道社区中的其他人在做什么。我会尝试在明天挖掘并用示例回答这个问题......如果我有时间...... – Sobieck