2013-02-04 117 views
48

我想了解如何使用Angularjs。它看起来像不错的框架,但我坚持与DI的一个小问题...在Angularjs模块的“运行”方法中注入依赖关系

我如何注入依赖在模块的“运行”方法?我的意思是我能够做到这一点,但它只有在我的service/factory/value与“run”参数名称相同的情况下才有效。 我建立一个简单的应用程序就说明我的意思:

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 }; }); 

为什么我需要它可能你问:)不过在我看来,首先关闭所有有有意义的命名空间来组织代码。它还可以最大限度地减少名称冲突,并且在最后减少JS的时候,事情会崩溃,因为它重命名为更短的名称。

+0

有一个在run方法小错字,第二支架是没有必要的。 –

回答

84

我认为,之所以

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) { 

}]); 
+4

谢谢,通过阵列来运行做了一份工作! –

+2

是的,如果代码被缩小,则需要在执行依赖注入时传递数组(因为变量名称$ rootScope和$ location可能会通过缩小变为a和b)。 –