2013-10-10 15 views
26

एंगुलरजेस में, नियंत्रकों में $scope और scope ("$" के बिना) निर्देश लिंक लिंक में उपयोग करने का कोई विशिष्ट कारण है? क्या यह सिर्फ एक सम्मेलन है या कुछ और?

+1

यह सिर्फ एक परिवर्तनीय नाम है, इसलिए वास्तव में नहीं। – ivarni

+0

समान प्रश्न [यहां] (http://stackoverflow.com/questions/18719140/angular-link-function-scope-vs-scope/18719347#comment27583647_18719347) – gargc

उत्तर

26

मामला है जब आप $scope नियंत्रक में निर्भरता इंजेक्शन का उपयोग कर इस मामले scope नाम के रूप में कार्य नहीं करेगा में चर नाम $scope मिलान, के आधार पर गुंजाइश injects है।

निर्देश के मामले में इंजेक्शन स्थिति आधारित है ताकि आप अपने चर a या b या किसी भी चीज़ का नाम दे सकें। लिंक समारोह के लिए निर्देश के क्रम

(scope, iElement, iAttrs, controller)

तो पहला तत्व हमेशा गुंजाइश वस्तु है।

+1

प्रतिक्रिया के लिए धन्यवाद। मुझे यहां एक विस्तृत स्पष्टीकरण भी मिला: http://www.thinkster.io/pick/aw9kWmdnik/angularjs-scope-vs-scope – Vijey

+0

मैं बाद वाले भाग को स्पष्ट करता हूं क्योंकि "निर्देश लिंक फ़ंक्शन के मामले में, इंजेक्शन स्थिति है आधारित, इसलिए 'स्कोप' का उपयोग करना वास्तव में सिर्फ सम्मेलन है। " (मुझे कोई अच्छी स्पष्टीकरण नहीं मिल रही है कि क्यों '$ स्कोप' का उपयोग यहां नहीं किया जाता है, साथ ही, अगर केवल स्थिरता के लिए) – rinogo

8

आप जॉन लिंडक्विस्ट द्वारा इस प्रश्न का एक बहुत अच्छा वीडियो जवाब यहां देख सकते हैं: http://egghead.io/lessons/angularjs-scope-vs-scope

+0

सही स्पष्टीकरण, सही दिशा में इंगित करने के लिए धन्यवाद। –

1

इस व्यवहार का कारण यह है कि, नियंत्रकों के विपरीत, निर्देश निर्भरता इंजेक्शन का उपयोग नहीं करते हैं, इसके बजाय वे दृश्य के पीछे रखे गए नियंत्रक द्वारा बनाए गए दायरे को पारित कर दिए जाते हैं। यह बहुत मुश्किल है, इसलिए आप अलग-अलग क्षेत्रों पर अपना निर्देश दोबारा उपयोग कर सकते हैं।

0

$"$scope" में इंगित करता है कि दायरे का मूल्य वर्तमान संदर्भ में इंजेक्शन दिया जा रहा है।

$scope$scopeProvider द्वारा प्रदान की जाने वाली एक सेवा है।

module.controller(function($scope) {...}) 

जो

module.controller(['$scope', function($scope) {...}]) 

हालांकि, scope के लिए आशुलिपि कुछ भी हो सकता है, यह एक समारोह पैरामीटर नाम है,: आप नियंत्रकों, निर्देशों या अन्य सेवाओं कोणीय के अंतर्निहित निर्भरता इंजेक्टर का उपयोग कर को इसकी सुई कर सकते हैं foo या a12342saa हो सकता है।

function link(scope, element, attributes) { 
    // Only scope 
} 
0

"$ स्कोप" में "$" इंगित करता है कि दायरे का मूल्य वर्तमान संदर्भ में इंजेक्शन दिया जा रहा है। लेकिन, दायरे के सभी संदर्भ निर्भरता इंजेक्शन पर आधारित नहीं हैं।

2

मॉड्यूल फैक्टरी विधियों जैसे नियंत्रक, निर्देश, फैक्ट्री, फ़िल्टर, सेवा, एनीमेशन, कॉन्फ़िगर और रन निर्भरता इंजेक्शन (डीआई) के माध्यम से तर्क प्राप्त करते हैं। DI के मामले में, आप स्कोप ऑब्जेक्ट डॉलर उपसर्ग i.e. $ स्कोप के साथ इंजेक्ट करते हैं। कारण इंजेक्शन तर्कइंजेक्शन-सक्षम ऑब्जेक्ट्स के बाद डॉलर ($) उपसर्ग के नाम से मेल खाना चाहिए।

उदाहरण के लिए, आप गुंजाइश इंजेक्षन कर सकते हैं और नीचे दिए गए के रूप में तत्व एक नियंत्रक में वस्तुओं:

module.controller('MyController', function ($scope, $element) { // injected arguments }); 

निर्देश लिंकर समारोह की तरह तरीकों निर्भरता इंजेक्शन के माध्यम से तर्क प्राप्त नहीं होता है, तो आप सिर्फ पारित स्कोप ऑब्जेक्ट डॉलर उपसर्ग यानी स्कोप का उपयोग किए बिना। इसका कारण है कि गुजरने वाले तर्क उसके कॉलर द्वारा प्राप्त किए जाते हैं।

module.directive('myDirective', function() // injected arguments here 
{ 
    return { 
     // linker function does not use dependency injection 
     link: function (scope, el, attrs) { 
      // the calling function will passes the three arguments to the linker: scope, element and attributes, in the same order 
     } 
    }; 
}); 

संक्षेप में, निर्भरता इंजेक्शन के मामले में गुंजाइश वस्तु गैर निर्भरता इंजेक्शन गुंजाइश वस्तु के मामले में $ गुंजाइश जबकि प्राप्त होता है गुंजाइश के रूप में या किसी नाम के साथ प्राप्त होता है।

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