2013-10-04 5 views
31

क्या प्रदाता विधि में DI करना संभव है?Angularjs का उपयोग कर प्रदाता में निर्भरताओं को इंजेक्ट कैसे करें?

इस उदाहरण

angular.module('greet',[]) 
.provider('greeter',function() { 

    this.$get=function() { 

    }; 
}) 
.service('greeterService',function($http){ 
    console.log($http); 
}) 
; 

सेवा में $http इंजेक्शन लगाने में सही क्रियान्वयन हो गया लगता है, लेकिन यह एक प्रदाता विधि में काम नहीं करता है और यह एक त्रुटि फेंकता है:

Unknown provider: $http

करता है सेवाओं को इंजेक्ट करने के लिए प्रदाता विधि डीआई के साथ काम करती है?

उत्तर

55

आप निश्चित रूप से $http प्रदाता को इंजेक्ट कर सकते हैं। बस सुनिश्चित करें कि यह $get में दिखाई देता है, फ़ंक्शन कन्स्ट्रक्टर नहीं। इस प्रकार है:

angular.module('greet',[]).provider('greeter',function() { 
    this.$get = function($http) { 

    }; 
}); 
+1

धन्यवाद। क्या इसका मतलब यह है कि हम $ http के बाहर $ http (या अन्य सेवाओं) का उपयोग नहीं कर सकते हैं? – Chung

+0

नहीं, आप कहीं भी $ http का उपयोग कर सकते हैं कि एक सेवा इंजेक्शन दी जा सकती है। $ get उनमें से एक है। –

+1

और इसे खनन स्वीकार्य कैसे बनाया जाए? –

2

आप वास्तव में $ पर निर्भरता इंजेक्षन मिलता है और फिर इसे आप क्या $ से पुनः प्राप्त पाने पर उपयोग करने के लिए स्टोर करने के लिए किया है। बिल्कुल खूबसूरत नहीं ...

3

नहीं, आप प्रदाता में स्वयं सेवा नहीं लगा सकते हैं। किसी प्रदाता की $ get विधि में किसी सेवा को इंजेक्शन देना कारखाने में एक सेवा इंजेक्शन जैसा ही है, लेकिन आप इसे प्रदाता फ़ंक्शन में सीधे इंजेक्ट नहीं कर सकते हैं।

$ प्राप्त करने और प्रदाता के बीच का अंतर यह है कि प्रदाता module loading phase के दौरान चलता है जबकि आपके द्वारा प्रदान की जा रही सेवा को तुरंत चालू करते समय $ प्राप्त होता है।

इसका तात्पर्य है कि आप अपने मॉड्यूल के मॉड्यूल लोडिंग/कॉन्फ़िगरेशन चरण के दौरान किसी भी सेवा का उपयोग नहीं कर सकते हैं। यह आपके द्वारा अपने कॉन्फ़िगरेशन ब्लॉक के अंदर चलने वाली सभी चीजें हैं, जैसे कि आपके ऐप मार्ग या राज्यों को परिभाषित करते समय, किसी भी सेवा का उपयोग नहीं कर सकते हैं।

प्रदाताओं के अलावा कॉन्फ़िगर ब्लॉक में इंजेक्ट करने वाली एकमात्र अन्य चीजें स्थिरांक हैं।

आप कुछ ऐसा कर सकते हैं जैसे IgrCndd सुझाया गया। लेकिन अगर आपको कॉन्फ़िगरेशन ब्लॉक में प्रदाता का उपभोग करने की आवश्यकता है, जो कि प्रदाता का उद्देश्य है, तो आपके पास आपके मूल्यों को इंजेक्शन नहीं दिया जाएगा। तो यह तब तक काम नहीं करेगा जब तक आप वादे का उपयोग करके कुछ बुरा हैक नहीं करते।

Further reading on injectables

9

आप एक प्रदाता में स्थिरांक और अन्य प्रदाताओं इंजेक्षन कर सकते हैं। एक अपवाद के साथ - सेवाओं या कारखानों नहीं। ऐसा लगता है कि आप प्रदाता में $injector सेवा इंजेक्ट कर सकते हैं - कम से कम, आप AngularJS 1.3.16 में कर सकते हैं।

.provider('foo', ['$injector', function ($injector) { 
    var messagePrefix = $injector.get('msgPrefix'); 
    this.message = ''; 

    this.$get = function() { 
    var that = this; 
    return function() { 
     return messagePrefix + that.message; 
    } 
    }; 
}]) 

आप $get विधि बाहर इंजेक्टर का उपयोग कर सकते हैं, लेकिन आप अभी भी नहीं कॉन्फ़िगर समय में इसे से सेवाएं प्राप्त कर सकते हैं।

See here for a demo

angular.module('greet',[]).provider('greeter', function() { 

    var $http; 

    function logIt() { 
     console.log($http); 
    } 

    this.$get = ['$http', function(_$http_) { 
     $http = _$http_; 

     return { 
      logIt: logIt 
     }; 
    }]; 
}); 

नोट कैसे समान इस, बराबर सेवा करने के लिए है दो कम परेशानी के बीच रूपांतरण बनाने:

6

IgrCndd के जवाब पर के बाद, यहाँ एक पैटर्न है कि संभावित गंदगी से बचने के सकता है

angular.module('greet',[]).factory('greeter', ['$http', function($http) { 

    function logIt() { 
     console.log($http); 
    } 

    return { 
     logIt: logIt 
    }; 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे