नेस्टेड निर्देशों के बीच संचार


61

निर्देशों के बीच संवाद स्थापित करने के कुछ तरीके प्रतीत होते हैं। कहते हैं कि आपके पास नेस्टेड निर्देश हैं, जहां आंतरिक निर्देशों को बाहरी से कुछ संवाद करना होगा (जैसे यह उपयोगकर्ता द्वारा चुना गया है)।

<outer>
  <inner></inner>
  <inner></inner>
</outer>

अब तक मेरे पास ऐसा करने के 5 तरीके हैं

require: माता-पिता का निर्देश

innerनिर्देश की आवश्यकता होती है सकते हैं outerके निर्देश है, जो अपने नियंत्रक पर कुछ विधि का पर्दाफाश कर सकते हैं। तो innerपरिभाषा में

require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
   // This can be passed to ng-click in the template
   $scope.chosen = function() {
     outerController.chosen(something);
   }
}

और outerनिर्देशक के नियंत्रक में:

controller: function($scope) {
   this.chosen = function(something) {
   }
}

$emit प्रतिस्पर्धा

innerनिर्देश कर सकते हैं $emitएक घटना है, जो outerनिर्देश का जवाब कर सकते हैं के माध्यम से, $on। तो innerनिर्देशक के नियंत्रक में:

controller: function($scope) {
  $scope.chosen = function() {
    $scope.$emit('inner::chosen', something);
  }
}

और outerनिर्देशक नियंत्रक में:

controller: function($scope) {
  $scope.$on('inner::chosen, function(e, data) {
  }
}

पैरेंट स्कोप में एक्साइट्यूट एक्सप्रेशन &

आइटम पैरेंट स्कोप में किसी एक्सप्रेशन के लिए बाध्य हो सकता है, और उसे एक उपयुक्त बिंदु पर निष्पादित कर सकता है। HTML ऐसा होगा:

<outer>
  <inner inner-choose="functionOnOuter(item)"></inner>
  <inner inner-choose="functionOnOuter(item)"></inner>
</outer>

इसलिए innerकंट्रोलर में एक 'इनरचोज़' फंक्शन होता है जिसे वह कॉल कर सकता है

scope: {
  'innerChoose': '&'
},
controller: function() {
  $scope.click = function() {
    $scope.innerChoose({item:something});
  }
}

जो (इस मामले में) outerनिर्देश के दायरे पर 'functionOnOuter' फ़ंक्शन को कॉल करेगा :

controller: function($scope) {
  $scope.functionOnOuter = function(item) {
  }
}

गैर-पृथक दायरे पर स्कोप वंशानुक्रम

यह देखते हुए कि ये नेस्टेड कंट्रोलर हैं, स्कोप इनहेरिटेंस काम पर हो सकता है, और इनर डाइरेक्टिव सिर्फ स्कोप चेन में किसी भी फंक्शन को कॉल कर सकता है, जब तक कि इसमें अलग स्कोप न हो)। तो innerनिर्देश में:

// scope: anything but a hash {}
controller: function() {
  $scope.click = function() {
    $scope.functionOnOuter(something);
  }
}

और outerनिर्देशन में:

controller: function($scope) {
  $scope.functionOnOuter = function(item) {
  }
}

सेवा द्वारा आंतरिक और बाहरी दोनों में इंजेक्ट किया जाता है

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

प्रश्न : दूसरों पर प्रत्येक संभावित कमियां और फायदे क्या हैं?


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

- कृपया इसे प्रस्ताव को देखने के softwareengineering.stackexchange.com/questions/344165/...
yellowblood

जवाबों:


7

मेरी प्राथमिकता &मुख्य रूप से निर्देश क्षेत्र में एक विशेषता को परिभाषित करने के लिए है क्योंकि मैं scope: {}एक निर्देश की परिभाषा को इसके एपीआई के रूप में देखता हूं । गुंजाइश विशेषता परिभाषा को देखने के लिए बहुत आसान है यह देखने के लिए कि निर्देशों की सही ढंग से कार्य करने के लिए निर्देश की आवश्यकता क्या है, इसके लिए $emit'd ईवेंट्स, इनहेरिटेड स्कोप फ़ंक्शंस या इंजेक्ट किए गए नियंत्रकों के लिए उपयोग किए गए फ़ंक्शंस और कंट्रोलर फ़ंक्शंस हैं ।


1

मेरी राय:

सेवाएं मॉड्यूल / निर्देशों / नियंत्रकों में व्यवहार / डेटा साझा करने का पसंदीदा तरीका है। निर्देश अलग-अलग चीजें हैं जिन्हें नस्ट किया जा सकता है या नहीं। नियंत्रकों को एक दर्शक के रूप में रहना चाहिए जितना वे कर सकते हैं, आदर्श रूप से किसी भी व्यावसायिक तर्क को समाप्त नहीं करना चाहिए।

इसलिए:

जब आप उन्हें पेरेंट स्कोप फ़ंक्शंस में पहुँच कर एक साथ वायरिंग करना शुरू करते हैं, तो मुझे लगता है कि आप उन्हें बहुत कठिन तरीके से युग्मित करने का जोखिम उठाते हैं और पूरे एप्लिकेशन को अपठनीय और घटकों को पुन: प्रयोज्य नहीं बनाते हैं। जब आप किसी सेवा में डेटा या व्यवहार साझा करते हैं, तो आपको अलग-अलग डेटा / व्यवहार के साथ संपूर्ण निर्देशों का पुन: उपयोग करने का लाभ होता है, यहां तक ​​कि रनटाइम में उपयोग की जाने वाली सेवा का निर्धारण भी। जो निर्भरता इंजेक्शन के बारे में सब कुछ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.