2013-02-04 13 views
48

में मॉड्यूल के "रन" विधि में निर्भरता इंजेक्ट करें I समझने की कोशिश कर रहा हूं कि मैं Angularjs के साथ कैसे काम करूं। यह अच्छी ढांचे की तरह दिखता है, लेकिन मैं DI के साथ एक छोटी सी समस्या के साथ अटक गया ...Angularjs

मैं मॉड्यूल के "रन" विधि में निर्भरता कैसे इंजेक्ट कर सकता हूं? मेरा मतलब है कि मैं इसे करने में सक्षम हूं, लेकिन यह केवल तभी काम करता है जब मेरे पास "रन" पैरामीटर नाम के समान नाम के साथ सेवा/कारखाना/मूल्य हो। मैं एक साधारण आवेदन का निर्माण उदाहरण देकर स्पष्ट करना कि मैं क्या मतलब है:

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

मैं की आवश्यकता क्यों है यह आप पूछ सकते हैं :) लेकिन मेरे मन में, पहले सभी बंद कोड व्यवस्थित करने के लिए सार्थक नामस्थान है। यह नाम टकराव को भी कम करेगा और आखिरकार, जेएस को कम करने पर, चीजें टूट जाती हैं, क्योंकि इसका नाम बदलकर नामों को छोटा कर दिया जाता है।

+0

रन विधि पर एक छोटा सा टाइपो नहीं है, दूसरे ब्रैकेट आवश्यक नहीं है। –

उत्तर

84

मुझे लगता है कि कारण

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

}]); 
+4

धन्यवाद, नौकरी करने के लिए सरणी पास करना !! –

+2

हां, यदि कोड को छोटा किया गया है तो आपको निर्भरता इंजेक्शन करते समय सरणी को पारित करने की आवश्यकता है (क्योंकि परिवर्तनीय नाम $ rootScope और $ स्थान को ए और बी में खनन द्वारा बदला जा सकता है, उदाहरण के लिए)। –