在Angularjs中的模块的“run”方法中注入依赖项

我想了解如何与Angularjs合作。 它看起来像不错的框架,但我坚持与DI的一个小问题…

我怎样才能注入依赖在模块的“运行”方法? 我的意思是我能够做到这一点,但只有当我有服务/工厂/价值与“运行”参数名称相同的名称才有效。 我build立一个简单的应用程序做说明我的意思是:

var CONFIGURATION = "Configuration"; //I would like to have App.Configuration var LOG_SERVICE = "LogService"; //I would like to have App.Services.LogService var LOGIN_CONTROLLER = "LoginController"; var App = {}; App.Services = {}; App.Controllers = {}; App = angular.extend(App, angular.module("App", []) .run(function ($rootScope, $location, Configuration, LogService) { //How to force LogService to be the logger in params? //not var = logger = LogService :) LogService.log("app run"); })); //App.$inject = [CONFIGURATION, LOG_SERVICE]; /* NOT WORKS */ App.Services.LogService = function (config) { this.log = function (message) { config.hasConsole ? console.log(message) : alert(message); }; }; App.Services.LogService.$inject = [CONFIGURATION]; App.service(LOG_SERVICE, App.Services.LogService); App.Controllers.LoginController = function (config, logger) { logger.log("Controller constructed"); } //The line below, required only because of problem described App.Controllers.LoginController.$inject = [CONFIGURATION, LOG_SERVICE]; App.factory(CONFIGURATION, function () { return { hasConsole: console && console.log }; }); 

为什么我需要它可能你问:)但在我的脑海里,首先要有有意义的命名空间来组织代码。 它也会减less名称冲突,最后,当JS缩小时,事情就会崩溃,因为它被重命名为更短的名字。

我认为这个原因

 App.$inject = [CONFIGURATION, LOG_SERVICE]; 

不起作用,因为你有2个其他的参数$rootScope$location ,你需要在$inject 。 所以它需要是:

 App.$inject = ["$rootScope", "$location", CONFIGURATION, LOG_SERVICE]; 

你可以注入你的服务的另一种方式是使用这个版本:

 app.run(["$rootScope", "$location", CONFIGURATION, LOG_SERVICE, function ($rootScope, $location, Configuration, LogService) { }] );