2013-02-04 18 views
48

'daki modülün "run" yöntemindeki bağımlılıkları enjekte etme Angularjs ile nasıl çalışacağımı anlamaya çalışıyorum. Güzel bir çerçeveye benziyor, ama DI ile ilgili küçük bir sorunla karşılaştım ...Angularjs

Modülün "run" yöntemine bağımlılıkları nasıl enjekte edebilirim? Bunu yapabildiğimi kastediyorum, ancak yalnızca "run" parametre adıyla aynı ada sahip hizmet/fabrika/değerim varsa çalışır. Ne demek istediğimi göstermek do basit bir uygulama oluşturmak: kodunu düzenlemek için anlamlı ad alanlarını olması

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

Neden her şeyden önce kapalı, bunu sormak :) Ama aklımda olabilir gerekir. Ayrıca isim çarpışmasını en aza indirecek ve son olarak, JS'yi minimize ederken, isimler daha fazla kısaltmak için yeniden adlandırıldığı için işler bozuluyor.

+0

çalıştırma yöntemine küçük yazım hatası yok, ikinci braket gerekli değildir. –

cevap

84

Seni $inject içinde enjekte etmek gerek 2 diğer parametreleri $rootScope & $location çünkü

App.$inject = [CONFIGURATION, LOG_SERVICE]; 

çalışmıyor sebebi olduğunu düşünüyorum. Yani olması gerekenden: Hizmetinizi enjekte edebilir

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

başka bir yolu da bu sürümünü kullanmaktır:

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

}]); 
+4

Teşekkürler, diziyi çalıştırmak için bir iş yaptı! –

+2

Yep, eğer kod küçültülmüşse, bağımlılık enjeksiyonu yaparken diziyi geçmeniz gerekir (çünkü değişkenler $ rootScope ve $ location, minification ile örneğin a ve b'ye dönüştürülebilir). –