2013-02-04 11 views
48

Sto cercando di capire come lavoro con Angularjs. Sembra un buon framework, ma ho bloccato un piccolo problema con DI ...Inject dependencies nel metodo "run" del modulo in Angularjs

Come posso iniettare dipendecie nel metodo "run" del modulo? Voglio dire, sono in grado di farlo, ma funziona solo se ho un servizio/factory/value con lo stesso nome del nome del parametro "run". Costruisco una semplice domanda non illustrare quello che voglio dire:

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

Perché ho bisogno può chiedere :) Ma nella mia mente, in primo luogo fuori tutti di avere spazi dei nomi significativi per organizzare il codice. Minimizzerà anche la collisione dei nomi e nell'ultimo caso, quando si esegue il minifing del JS, le cose si guasteranno, poiché rinominato per abbreviare i nomi.

+0

C'è un piccolo errore di battitura sul metodo run, seconda staffa non è necessario. –

risposta

84

Penso che la ragione per

App.$inject = [CONFIGURATION, LOG_SERVICE]; 

non funziona, è perché avete 2 altri parametri $rootScope & $location che che devono essere iniettate nel $inject. Quindi ha bisogno di essere:

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

Un altro modo è possibile iniettare il vostro servizio è quello di utilizzare questa versione:

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

}]); 
+4

Grazie, passare l'array per correre ha fatto un lavoro !! –

+2

Sì, se il codice è minisito è necessario passare l'array quando si esegue l'iniezione delle dipendenze (poiché la variabile chiama $ rootScope e $ posizione può essere modificata dal minification in aeb, ad esempio). –

Problemi correlati