2016-10-26 14 views
9

मैं AngularJS 1.x के साथ काम कर रहा हूं और मैं उसी मॉड्यूल में एक ही सेवा को कई बार परिभाषित कर सकता हूं। निम्नलिखित स्निपेट में, मैं सेवा मॉड्यूल myApp में nameService 2 बार परिभाषित करने कर रहा हूँ: "दूसरा परिभाषा":उसी मॉड्यूल में कोणीय जेएस सेवा कई बार घोषित करें

(function() { 
    'use strict'; 

    angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

    MainController.$inject = ['nameService']; 

    function MainController(nameService) { 
    var vm = this; 

    vm.message = nameService.getName(); 
    } 

    function nameService1() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'First Definition'; 
    } 
    } 

    function nameService2() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'Second Definition'; 
    } 
    } 
})(); 

रनटाइम पर, AngularJS मूल्य सेवा की दूसरी कार्यान्वयन द्वारा लौटाए का प्रयोग करेंगे। कृपया this Plunker example देखें।

तो, अनुभवजन्य रूप से, AngularJS हमेशा किसी सेवा की नवीनतम परिभाषा का उपयोग करता है, जो पिछले लोगों को अनदेखा करता है।

मेरा प्रश्न है: क्या इस व्यवहार का वर्णन करने वाला कोई आधिकारिक दस्तावेज है?

+3

जावास्क्रिप्ट अनुक्रमिक रूप से संकलित करता है, इसलिए जब यह दूसरे नाम सेवा का सामना करता है, तो यह पिछले एक – aliasav

+0

को ओवरराइड करता है, ठीक है, जावास्क्रिप्ट अनुक्रमिक रूप से संकलित कर सकता है लेकिन यह कोणीय ढांचा है जो तय करता है कि इसे पहले से परिभाषित सेवा की दूसरी परिभाषा कब मिलती है। उदाहरण के लिए, यह हमेशा पहला उदाहरण रखने और दूसरों को त्यागने का फैसला कर सकता है, लेकिन इसके विपरीत, ऐसा लगता है कि यह हमेशा अंतिम रहता है। मेरा प्रश्न है: क्या इस व्यवहार के बारे में कोई आधिकारिक दस्तावेज है? – Andrea

उत्तर

1

यहां, आप कारखाने/सेवा की परिभाषा को ओवरराइट कर रहे हैं। कारखाना/सेवा सिंगलटन है यानी इसका एक उदाहरण होगा।

factory('name', constructing_function) 

आपका मामला,

factory('nameService', nameService1)//Here object { getName: getName } will be assigned to nameService instance. 

factory('nameService', nameService2)//Here object { getName: getName } (#2nd definition) will be assigned to nameService instance. i.e. nameservice instance referring to (#2nd definition). 
+0

आपके उत्तर के लिए धन्यवाद। मुझे पता है कि एंगुलरजेएस में सिंगलटन सेवा है लेकिन मुझे यह जानने की जरूरत है कि क्या आधिकारिक कोणीय दस्तावेज है जो कहता है कि "कोणीय हमेशा नवीनतम परिभाषा लेते हैं, पिछले लोगों को अनदेखा करते हैं"।क्या आपको पता है कि डॉक्टर में इस तरह की सजा है? – Andrea

+0

ऐसा मत सोचो। लेकिन मैंने समझाया कि वास्तव में समुद्र के पीछे क्या हो रहा है। – ram1993

+0

हां, धन्यवाद राम 1 9 3 9। लेकिन तकनीकी रूप से मैं इसे जानता हूं लेकिन मुझे इस व्यवहार के कुछ प्रकार के "आधिकारिक संदर्भ" (दस्तावेज, कैसे-कैसे, आदि) की आवश्यकता है। – Andrea

1

रास्ता कैसे जावास्क्रिप्ट काम करता है यही कारण है कि:

function Vinoth(){console.log("Printing first")} 

function Something(){console.log("Printing Something")} 

function Vinoth(){console.log("Printing Second")} 

जब आप एक console.log(Vinoth()); करते हैं, यह हमेशा Second एक मुद्रित होगा। अपने दूसरे भाग के लिए खत्म हो:

angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

AngularJS सेवाओं इसलिए इसकी आपके आवेदन जीवन चक्र भर में एक उदाहरण होने जा रहा, singleton स्वभाव से कर रहे हैं। आपका nameService1 and nameService2 उसी nameServiceinstance पर इंगित कर रहा है। तकनीकी रूप से यह nameServicenameService2 रखता है क्योंकि यह hoisting के अनुसार पहले होता है।

+0

ठीक है, जैसा कि मैंने उपर्युक्त टिप्पणी में "उपनाम" को समझाया है: कोणीय ढांचा जो तय करता है कि इसे पहले से परिभाषित सेवा की दूसरी परिभाषा कब मिलती है। उदाहरण के लिए, यह हमेशा पहला उदाहरण रखने और दूसरों को त्यागने का फैसला कर सकता है, लेकिन इसके विपरीत, ऐसा लगता है कि यह हमेशा अंतिम रहता है। मेरा सवाल है: क्या इस व्यवहार के बारे में कोई आधिकारिक दस्तावेज है? – Andrea

+0

@Andrea: कूल, जावास्क्रिप्ट Hoisting में देखो .... यह व्यवहार Angularjs भी है ... – Thalaivar

+0

सलाह के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि आप क्यों होस्टिंग के एक मीटर है। कोड के मेरे स्निपेट में दो फ़ंक्शंस के अलग-अलग नाम होते हैं ('nameService1' और' nameService2')। केवल स्ट्रिंग 'फैक्ट्री()' विधि में सेवा का नाम पहचानती है ('" nameService "')। – Andrea

0

इस समारोह के लिए कोई आधिकारिक दस्तावेज नहीं है।

यदि आप चाहते हैं कि आप इस सुविधा के लिए दस्तावेज जोड़ने के लिए कोणीय के रखरखावकर्ता से पूछ सकें।

0

सेवा (इंजेक्ट) को दो बार परिभाषित करने की आवश्यकता नहीं है। बेहतर समाधान है, आप एक बार सेवा को परिभाषित करते हैं। और

var nameService2 = angular.copy(nameService); 

की तरह इस्तेमाल करते हैं,

angular.module('myApp', []).controller('MainController', MainController) .factory('nameService', nameService1) 

इस के अंदर, हम है कि सेवा की तरह उपयोग कर सकते हैं, यह सबसे अच्छा अभ्यास के लिए है।

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