इन फ़ंक्शन कॉल्स के बीच और क्या होता है?
विभिन्न निर्देश कार्यों दो अन्य कोणीय कार्यों कहा जाता है के भीतर से क्रियान्वित कर रहे हैं $compile
(जहां निर्देश के compile
मार डाला जाता है) और एक आंतरिक समारोह कहा जाता है nodeLinkFn
(जहां निर्देश के controller
, preLink
और postLink
क्रियान्वित कर रहे हैं)। निर्देश कार्यों के पहले और बाद में कोणीय कार्य के भीतर विभिन्न चीजें होती हैं। शायद सबसे विशेष रूप से बच्चे की पुनरावृत्ति है। निम्नलिखित सरलीकृत चित्रण संकलन और लिंक चरणों के भीतर महत्वपूर्ण चरण दिखाता है:
इन चरणों को प्रदर्शित करने के लिए, कृपया निम्न HTML मार्कअप का उपयोग करें:
<div ng-repeat="i in [0,1,2]">
<my-element>
<div>Inner content</div>
</my-element>
</div>
निम्नलिखित निर्देश के साथ:
myApp.directive( 'myElement', function() {
return {
restrict: 'EA',
transclude: true,
template: '<div>{{label}}<div ng-transclude></div></div>'
}
});
संकलन
compile
एपीआई दिखता है तो चाहते:
compile: function compile( tElement, tAttributes ) { ... }
अक्सर मापदंडों को उपसर्ग t
दिया जाता है ताकि तत्वों और विशेषताओं को सूचित किया जा सके जो स्रोत टेम्पलेट के हैं, उदाहरण के बजाय।
compile
ट्रांसकोड की गई सामग्री को कॉल करने से पहले (यदि कोई हो) हटा दिया जाता है, और टेम्पलेट मार्कअप पर लागू होता है। इस प्रकार, compile
फ़ंक्शन को प्रदान किया गया तत्व ऐसा दिखेगा:
<my-element>
<div>
"{{label}}"
<div ng-transclude></div>
</div>
</my-element>
ध्यान दें कि इस बिंदु पर ट्रांसकोड की गई सामग्री फिर से नहीं डाली गई है।
निर्देश के लिए कॉल के बाद .compile
, कोणीय उन सभी बाल तत्वों को पीछे छोड़ देगा, जिनमें वे भी शामिल हो सकते हैं जो केवल निर्देश (टेम्पलेट तत्व, उदाहरण के लिए) द्वारा पेश किए गए हैं।
सृजन की वृत्ति
हमारे मामले में, ऊपर स्रोत टेम्पलेट के तीन उदाहरण (द्वारा ng-repeat
) बनाए जाएंगे । इस प्रकार, निम्नलिखित अनुक्रम तीन बार निष्पादित करेगा, एक बार प्रति उदाहरण।
नियंत्रक
controller
एपीआई शामिल है:
controller: function( $scope, $element, $attrs, $transclude ) { ... }
लिंक चरण में प्रवेश, लिंक फ़ंक्शन के माध्यम से लौटा $compile
अब एक गुंजाइश के साथ प्रदान की जाती है।
सबसे पहले, लिंक फ़ंक्शन अनुरोध किए जाने पर एक चाइल्ड स्कोप ( scope: true
) या एक अलग स्कोप ( scope: {...}
) बनाता है ।
नियंत्रक तब निष्पादित किया जाता है, उदाहरण तत्व के दायरे के साथ प्रदान किया जाता है।
पूर्व लिंक
pre-link
एपीआई दिखता है तो चाहते:
function preLink( scope, element, attributes, controller ) { ... }
वस्तुतः कॉल के बीच निर्देश .controller
और .preLink
फ़ंक्शन के बीच कुछ भी नहीं होता है । कोणीय अभी भी सिफारिश प्रदान करता है कि प्रत्येक का उपयोग कैसे किया जाना चाहिए।
.preLink
कॉल के बाद , लिंक फ़ंक्शन प्रत्येक चाइल्ड एलिमेंट को पार कर जाएगा - सही लिंक फ़ंक्शन को कॉल करना और इसे वर्तमान स्कोप को संलग्न करना (जो बाल तत्वों के लिए मूल गुंजाइश के रूप में कार्य करता है)।
पोस्ट-लिंक
post-link
एपीआई के समान है pre-link
समारोह:
function postLink( scope, element, attributes, controller ) { ... }
शायद यह ध्यान देने योग्य है कि एक बार एक निर्देश के .postLink
कार्य को बुलाया जाता है, इसके सभी बच्चों के तत्वों की लिंक प्रक्रिया पूरी हो गई है, जिसमें बच्चों के सभी .postLink
कार्य शामिल हैं।
इसका मतलब यह है कि जब तक .postLink
कॉल किया जाता है, तब तक बच्चे 'लाइव' तैयार हो जाते हैं। यह भी शामिल है:
- अनिवार्य तथ्य
- ट्रांसकॉक्शन लागू किया गया
- गुंजाइश जुड़ी हुई है
इस स्तर पर टेम्पलेट इस प्रकार दिखाई देगा:
<my-element>
<div class="ng-binding">
"{{label}}"
<div ng-transclude>
<div class="ng-scope">Inner content</div>
</div>
</div>
</my-element>