在“运行"中注入依赖项Angularjs中模块的方法 [英] Inject dependencies in "run" method of the module in Angularjs

查看:28
本文介绍了在“运行"中注入依赖项Angularjs中模块的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解如何使用 Angularjs.它看起来是一个不错的框架,但我在 DI 方面遇到了一个小问题......

I trying to understand how do I work with Angularjs. It looks like nice framework, but I stuck with a little problem with DI...

如何在模块的run"方法中注入依赖?我的意思是我可以做到,但只有当我的服务/工厂/值与运行"参数名称同名时才有效.我构建了一个简单的应用程序来说明我的意思:

How I can inject dependecies in "run" method of the module? I mean I able to do it, but it works only if I have service/factory/value with as same name as "run" parameter name. I build a simple application do illustrate what I mean:

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 时,事情会崩溃,因为它重命名为更短的名称.

Why I need it may you ask :) But in my mind, first off all to have meaningful namespaces to organize the code. It will also minimize name collision and in the last, when minifing the JS, the things breaks down, since it renamed to more shorten names.

推荐答案

我认为是这个原因

App.$inject = [CONFIGURATION, LOG_SERVICE];

不起作用,是因为您还有 2 个其他参数 $rootScope &$location 您需要在 $inject 中注入.所以它必须是:

doesn't work, is because you have 2 other parameters $rootScope & $location that you need to inject in the $inject. So it needs to be:

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

注入服务的另一种方法是使用此版本:

Another way you can inject your service is to use this version:

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

}] );

这篇关于在“运行"中注入依赖项Angularjs中模块的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆