51

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をミニファイするときに、名前がより短い名前に変更されたため、問題が発生します。

4

1 に答える 1

86

その理由は

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

}] );
于 2013-02-04T14:07:08.700 に答える