我试图了解如何使用 Angularjs。它看起来像一个不错的框架,但我遇到了 DI 的一个小问题......
如何在模块的“运行”方法中注入依赖项?我的意思是我能够做到,但只有当我的服务/工厂/值与“运行”参数名称同名时它才有效。我构建了一个简单的应用程序来说明我的意思:
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 时,事情会崩溃,因为它重命名为更短的名称。