2013-02-04 6 views
48

Angularjsでの作業方法を理解しようとしています。それは素晴らしいフレームワークのように見えますが、私はDIで少し問題に固執しました...Angularjsでのモジュールの "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メソッドの小さなタイプミスがありますが、第2のブラケットは必要ありません。 –

答えて

84

は、私はあなたが$injectに注入する必要がある2つのその他のパラメータ$rootScope & $locationを持っているので、

App.$inject = [CONFIGURATION, LOG_SERVICE]; 

が動作しない理由は、あると思います。だから、それはする必要があります:あなたはあなたのサービスを注入することができます

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に縮小されて変更される可能性があるため、依存関係注入を行うときに配列を渡す必要があります。 –

関連する問題