2012-10-06 10 views
43

में गतिशील रूप से निर्भरता को इंजेक्ट करने के लिए कैसे करें मैं अभी भी एंगुलरज पर एक पदार्पणकर्ता हूं। मैं अपने नियंत्रक में गतिशील रूप से एक सेवा (जो मैंने बनाया) की निर्भरता इंजेक्ट करना चाहता हूं।नियंत्रक

लेकिन जब मैं निर्भरता के साथ एक सेवा कोड, मैं इस त्रुटि मिली:

त्रुटि: अज्ञात प्रदाता: $ windowProvider < - $ खिड़की < - बेस 64

इस नियंत्रक के कोड है।

var base64 = angular.injector(['servicesModule']).get('base64'); 
console.log("base64", base64.encode("my text will be encoded")); 

इस कोड काम करता है:

var servicesModule = angular.module('servicesModule', []); 
servicesModule.factory('base64', function() { 
    return { 

     name: 'base64', 
     readonly: false, 

     encode: function(input) { 
      return window.btoa(input); 
     }, 

     decode: function(input) { 
      return window.atob(input); 
     } 

    }; 

}); 

इस कोड काम नहीं करता: जब सेवा नियंत्रक के रूप में एक ही मॉड्यूल में है

var extModule = angular.module('ext', []); 
extModule.factory('base64', ['$window', function($window) { 
    return { 

     name: 'base64', 
     readonly: false, 

     encode: function(input) { 
      return $window.btoa(input); 
     }, 

     decode: function(input) { 
      return $window.atob(input); 
     } 

    }; 

}]); 

एक और समस्या है।

त्रुटि:: मॉड्यूल निर्भरता है है, मैं काम नहीं करता है (मैं अपने मॉड्यूल config में $ routeProvider निर्भरता) अज्ञात प्रदाता: mainModule

var mainModule = angular.module('main', [], 
    function($routeProvider, $locationProvider) { 
     //Some routing code 
    } 
); 

जे एस Fiddles से $ routeProvider निर्भरता के साथ

एक ही मॉड्यूल (नियंत्रक + सेवा): http://jsfiddle.net/yrezgui/YedT2/

विभिन्न मॉड्यूल http://jsfiddle.net/yrezgui/YedT2/4/

निर्भरता के बिना विभिन्न मॉड्यूल: निर्भरता के साथ http://jsfiddle.net/yrezgui/YedT2/5/

+0

इन दोनों उदाहरणों को काम करना चाहिए। यदि वे समस्या नहीं करते हैं तो कुछ और होना चाहिए। यह बहुत अच्छा होगा अगर आप जेएसफ़िल्ड प्रदान कर सकें जिसे हम ठीक कर सकते हैं, ताकि हमारे पास एक छोटा सा स्निपेट की बजाय संपूर्ण ऐप हो। –

उत्तर

59

फोन मत करो angular.injector() - यह एक नया इंजेक्टर पैदा करता है। इसके बजाय, अपने नियंत्रक में पहले से ही बनाया $injector इंजेक्षन और प्रयोग यह:

तो बजाय:

var algoController = function($scope) { 
    $scope.base64 = angular.injector(['main']).get('base64'); 
}; 

क्या इस:

var algoController = function($scope, $injector) { 
    $scope.base64 = $injector.get('base64'); 
}; 

लेकिन समय के सबसे आप अपनी सेवा इंजेक्षन चाहिए सीधे, गतिशील रूप से, जैसे:

var algoController = function($scope, base64) { 
    $scope.base64 = base64; 
}; 

यह भी देखें AngularJS dynamically inject scope or controller

+0

बेस 64 कैसे प्राप्त करें यदि यह किसी अन्य सेवा पर निर्भर करता है – sms