2013-10-19 8 views
7

मैं संकलन और लिंक फ़ंक्शन के बीच अंतर को समझने की कोशिश कर रहा हूं। the compiler के लिए कोणीय दस्तावेज में यहकोणीयजेएस: एनजी-दोहराना संकलन और लिंक फ़ंक्शंस

संग्रह में प्रत्येक आइटम के लिए एक बार एनजी-दोहराना क्लोन डीओएम तत्व जैसे कुछ निर्देश। एक संकलन और लिंक चरण होने से प्रदर्शन में सुधार होता है क्योंकि क्लोन टेम्पलेट को केवल एक बार संकलित करने की आवश्यकता होती है, और उसके बाद प्रत्येक क्लोन इंस्टेंस के लिए एक बार लिंक किया जाता है।

मैं source code को देखा कोशिश करते हैं और समझते हैं कि यह कैसे काम करता है और मैं नहीं मिलता है कि यह कैसे प्रत्येक क्लोन उदाहरण के लिए एक अलग जोड़ने समारोह बनाता है। मेरे लिए ऐसा लगता है कि संकलन फ़ंक्शन एनजी-दोहराव निर्देश के लिए एक लिंकिंग फ़ंक्शन देता है। यह लिंकिंग फ़ंक्शन एनजी-दोहराने में प्रत्येक तत्व के लिए एक नया दायरा बनाता है लेकिन प्रत्येक क्लोन इंस्टेंस को एक अलग लिंकिंग फ़ंक्शन नहीं देता है।

उत्तर

6

एक चीज जो उनके विवरण के बारे में भ्रमित हो सकती है वह <ng-repeat> के भीतर निर्देश के विचार पर चर्चा करने की कोशिश कर रहा है, क्योंकि <ng-repeat> पर चर्चा करने के विरोध में।

विचार यह है कि यदि आपके पास किसी विशेष निर्देश के कई तत्काल हैं (उदाहरण के लिए क्योंकि वे <ng-repeat> के भीतर हैं) संकलन फ़ंक्शन एक बार और केवल आपके ऐप के जीवनकाल के लिए निष्पादित किया जाता है। इस प्रकार, यहां कोड डालने का प्रदर्शन लाभ यह है कि यह केवल एक बार चलाया जाता है। और यह भी संभावित समस्या है। संकलन समारोह में जाने वाली एकमात्र चीजें ऐसी चीजें हैं जो उस निर्देश के सभी तत्कालताओं के लिए आम हैं।

दूसरी तरफ लिंक फ़ंक्शन उस निर्देश के प्रत्येक तत्कालता के लिए निष्पादित किया जाता है (उदाहरण के लिए, उदाहरण के लिए, <ng-repeat> के भीतर)।

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

कोणीय के लेखकों में से एक ने वास्तव में इस का एक बड़ा चर्चा के लिए, बाहर की जाँच: http://www.youtube.com/watch?v=WqmeI5fZcho&list=TLwY_LmqLDXW_3QKhTNm1zKa9j40TvPO2O (13:42 वह जगह है जहाँ Misko पता लिंक बनाम संकलन कार्यों) KayakDave के जवाब देने के लिए

+0

अपने जवाब और लिंक के लिए धन्यवाद, वे निश्चित रूप से बहुत मदद की। यह सुनिश्चित करने के लिए कि मैं सही ढंग से समझ रहा हूं ऐसा लगता है कि यदि आप तत्व पर एनजी-दोहराना निर्देश का उपयोग करने जा रहे हैं तो आप केवल एक संकलन का उपयोग करेंगे। अन्यथा आप लिंक फ़ंक्शन के साथ सब कुछ और अधिक कर सकते हैं इसलिए संकलन का उपयोग करने के लिए कोई वास्तविक लाभ नहीं है। – jvans

+0

मुझे लगता है कि आपको यह मिला है। सिवाय इसके कि यह कोई ऐसी स्थिति है जहां आपके पास निर्देश की कई प्रतियां हैं। एनजी-दोहराना उस स्थिति का वर्णन करने का एक सुविधाजनक तरीका है। – KayakDave

+0

और दोनों स्थितियों में लिंक अभी भी अधिक सामान्य रूप से उपयोग किया जाने वाला फ़ंक्शन है। जैसा कि आप कहते हैं, आप लिंक फ़ंक्शन के साथ और अधिक कर सकते हैं क्योंकि यह वास्तविक दायरे के साथ वास्तविक अस्थिरता से जुड़ा हुआ है। – KayakDave

2

इसके अतिरिक्त, यहाँ एक सरल है एनजी-दोहराव का कार्यान्वयन जो संग्रह में से कोई भी संग्रह नहीं करता है। प्लंकर में लॉगिंग है जो घटनाओं के अनुक्रम को दिखाती है और यहां तक ​​कि कुछ उदाहरण भी हैं जो दिखाते हैं कि प्राथमिकता कैसे काम करती है।

Plunker

Link to source question

जावास्क्रिप्ट:

app.directive('fakeRepeat', function() { 
    return { 
    priority: 1000, 
    terminal: true, 
    transclude: 'element', 
    compile: function(el, attr, linker) { 
     return function(scope, $element, $attr) { 
     angular.forEach(scope.$eval($attr.fakeRepeat).reverse(), function(x) { 
      var child = scope.$new(); 
      child[attr.binding] = x; 
      linker(child, function(clone) { 
      $element.after(clone); 
      }); 
     }); 
     } 
    } 
    } 
}); 
संबंधित मुद्दे