2014-05-22 9 views
6

मैंने सामान्य रूप से सीखा है कि फ़ंक्शन कार्यान्वयन के पास फ़ंक्शन तर्कों के लिए कोई नाम हो सकता है जब तक कि इसे सही क्रम में आपूर्ति की जाती है। यह फ़ंक्शन को बाहरी दुनिया से समेकित करता है और स्थानीय नामों का आउटपुट पर कोई प्रभाव नहीं पड़ता है। कार्यान्वयन में स्थानीय चर के लिए सभी अधिकार हैं। अगर मैं "बार" के बजाय "$ गुंजाइश" मैं कोई त्रुटि मिलती है डाल वहाँ

function Controller($scope) 
{ 
    $scope.name = "Something"; 
} 

: कोणीय जे एस में हालांकि, यह की तरह कुछ है करने के लिए सहज ज्ञान युक्त मुकाबला करने के लिए लगता है। यह सामान्य कार्य नहीं है जिसका हम उपयोग करते हैं। मुझे विश्वास है कि यह DI के साथ कुछ करने के लिए है, लेकिन क्या कोई इस अवधारणा को समझा सकता है? मुझे इसे "फ़ंक्शन" कहना मुश्किल लगता है क्योंकि यह बाहरी दुनिया पर निर्भर है - विशेष रूप से तर्क का नाम।

यदि डीआई असली कारण है, तो क्या कोई मुझे बता सकता है कि इसे कैसे लागू किया जाता है? आम तौर पर मैं डीआई को अच्छा कर सकता हूं जब मैं टेस्ट केस के लिए ऑब्जेक्ट बनाना चाहता हूं। इस मामले में डीआई क्या भूमिका निभाता है?

डीआई के सामान्य परिदृश्यों में जो मैंने पार किया है, तर्क जो पारित हो जाता है, फ़ंक्शन के लिए एक सेवा करता है जैसे foo displayTime (घड़ी) {clock.something}। समय समारोह के लिए सिर्फ एक सेवा है। हालांकि यहां मुझे लगता है कि, $ गुंजाइश और ढांचा कार्य के साथ जादू करना प्रतीत होता है कि तर्क को व्यक्त करने का घोषणात्मक तरीका है।

संपादित करें: जाहिर है इस कार्यक्षमता कम करें टूटता जेएस और हम में How do the function argument names in Angular.js objects connect to other objects?

+2

कोणीय वास्तव में तर्कों का मूल्यांकन करता है (फ़ंक्शन का उपयोग करके।टूस्ट्रिंग) सही संसाधनों को नाम और इंजेक्ट करता है, जब आप कोणीय के साथ शुरू करते हैं तो यह उन चीजों में से एक है जो आप सीखते हैं! यहां देखें: http://stackoverflow.com/questions/16949889/how-do-the-function-argument-names-in-angular-js-objects-connect-to-other-object –

+1

"डीआई के सामान्य परिदृश्य में पार हो गया है, जो तर्क पारित हो जाता है वह कार्य के लिए एक सेवा करता है "... यह कोणीय में भी मामला है, हालांकि स्कॉप्स थोड़ी विशेष हैं ... https://github.com/angular/angular.js/ विकी/समझने वाली स्कॉप्स जो स्कॉप्स और https://docs.angularjs.org/guide/scope के बारे में विवरण में जाती है जो शायद आपको का उपयोग करने के तरीके के बारे में अधिक पसंद करती है लेकिन आप अपनी खुद की घड़ी सेवा को इंजेक्ट कर सकते हैं: myApp.service ('घड़ी', ['अन्य निर्भरता', फ़ंक्शन (ओडी) {this.something = "मैं घड़ी हूं!";}]); – Jens

उत्तर

7

एक तरह से एक नियंत्रक परिभाषित करने के लिए की तरह करने की जरूरत है ताकि तरह है: पूरी कारण है कि इस तरह काम करता है कोणीय

myApp.controller("TestController", ['$scope', function(bar) { 
    // now "bar" is actually the scope variable 
}]); 

जिस तरह से यह निर्भरता इंजेक्शन करता है। असल में यह निर्भरताओं की तलाश करता है (उदाहरण के लिए $scope) और यह चर के नाम के आधार पर उन्हें इंजेक्ट करने का प्रयास करता है। इसका मतलब है कि यदि आप $scope का नाम कुछ अलग करते हैं तो यह इसके बजाय उस अन्य आइटम को इंजेक्ट करने का प्रयास करता है। bar ऐसा कुछ नहीं है जो कोणीय जानता है कि इंजेक्ट कैसे करें ताकि आपको $scope की बजाय undefined मान प्राप्त हो जाये।

उपरोक्त मेरा उदाहरण काम करता है क्योंकि मैंने चर के नामों को अलग करने के लिए एक सरणी का उपयोग किया है जो चर से स्वयं इंजेक्शन दिए जा रहे हैं। अब आपको $scope शब्द का उपयोग करने की आवश्यकता नहीं है लेकिन आपको चर को उसी क्रम में रखना होगा। https://docs.angularjs.org/tutorial/step_05

डि के प्वाइंट (कोणीय में)

यदि आप सोच रहे हैं: डि की पूरी अवधारणा एक छोटी पोस्ट में समझाने के लिए इसलिए मैं यहाँ कोणीय की साइट पर इसके बारे में अधिक पढ़ने की सलाह देते बहुत ही जटिल है - इस समस्या को क्यों जाना है? आपके पास सूची में मौजूद पहले चर में स्वचालित रूप से $scope इंजेक्ट क्यों न करें? जवाब है - लचीलापन & अनुकूलन। कोणीय के साथ, आप अपनी सेवाओं और कारखानों को परिभाषित कर सकते हैं, फिर उन्हें अपने नियंत्रकों में इंजेक्ट कर सकते हैं। यह आपको साझा दिनचर्या, वस्तुओं या यहां तक ​​कि कस्टम नियंत्रण को परिभाषित करने की शक्ति देता है और फिर जितना चाहें उतने नियंत्रकों में उनका उपयोग करता है। DI के बिना - इनमें से कोई भी संभव नहीं होगा। दोबारा, ये बहुत ही जटिल अवधारणाएं हैं इसलिए मैं विश्वास की एक छलांग से शुरू करने की सलाह देता हूं कि "यह काम करता है", सेवाओं के बारे में सीखना, फिर बाद में आप वापस जा सकते हैं और इसके बारे में और अधिक पढ़ सकते हैं। उस बिंदु पर मुझे लगता है कि डी को पूरी तरह से अधिक समझदारी करनी चाहिए!

शुभकामनाएँ!

+0

दिलचस्प। तो मूल रूप से आपका मतलब है कि समारोह को कोणीय द्वारा बुलाया जाना है और बाहर की दुनिया नहीं? यह पूरी तरह से एक जेएस समारोह नहीं है? – Nishant

+1

@ निशांत आप फ़ंक्शन को कॉल कर सकते हैं क्योंकि आपने इसे किसी भी चीज़ से परिभाषित किया है, लेकिन यह स्पष्ट रूप से आपको बहुत अच्छा नहीं करेगा। भले ही, आपको सिंटैक्स drew_w का उपयोग करना चाहिए क्योंकि इसका अर्थ यह भी है कि आप कार्यक्षमता को तोड़ने के बिना सुरक्षित रूप से अपने कोड को छोटा कर सकते हैं। – Jens

+0

@ निशांत यह चर का इंजेक्ट करने के लिए DI का उपयोग करता है, * लेकिन * यह अभी भी एक शुद्ध जावास्क्रिप्ट फ़ंक्शन है। मैं समझने के लिए DI के बारे में अधिक पढ़ने की सलाह देता हूं कि यहां क्या हो रहा है! –

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