ऐसे मामलों में जहां आपके पास एक एकल DOM तत्व पर कई निर्देश हैं और जहां वे जिस मामले में लागू होते हैं उस मामले में, आप priority
उनके आवेदन का आदेश देने के लिए संपत्ति का उपयोग कर सकते हैं । उच्च संख्या पहले भागते हैं। यदि आप एक निर्दिष्ट नहीं करते हैं तो डिफ़ॉल्ट प्राथमिकता 0 है।
EDIT : चर्चा के बाद, यहाँ पूर्ण कार्य समाधान है। कुंजी विशेषता को हटाने के लिए थी : element.removeAttr("common-things");
और यह भी element.removeAttr("data-common-things");
(यदि data-common-things
HTML में उपयोगकर्ता निर्दिष्ट करें )
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true, //this setting is important, see explanation below
priority: 1000, //this setting is important, see explanation below
compile: function compile(element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
return {
pre: function preLink(scope, iElement, iAttrs, controller) { },
post: function postLink(scope, iElement, iAttrs, controller) {
$compile(iElement)(scope);
}
};
}
};
});
वर्किंग प्लंकर पर उपलब्ध है: http://plnkr.co/edit/Q13bUt?p=preview
या:
angular.module('app')
.directive('commonThings', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true,
priority: 1000,
link: function link(scope,element, attrs) {
element.attr('tooltip', '{{dt()}}');
element.attr('tooltip-placement', 'bottom');
element.removeAttr("common-things"); //remove the attribute to avoid indefinite loop
element.removeAttr("data-common-things"); //also remove the same attribute with data- prefix in case users specify data-common-things in the html
$compile(element)(scope);
}
};
});
डेमो
स्पष्टीकरण हमें क्यों सेट करना है terminal: true
और priority: 1000
(एक उच्च संख्या):
जब DOM तैयार हो जाता है, कोणीय सभी पंजीकृत निर्देशों की पहचान करने के लिए DOM चलता है और निर्देशों को एक-एक करके संकलित करता है priority
यदि ये निर्देश एक ही तत्व पर हैं । हमने यह सुनिश्चित करने के लिए कि यह पहले संकलित किया जाएगा और यह निर्देश संकलित होने के बाद terminal: true
अन्य निर्देशों को छोड़ दिया जाएगा, यह सुनिश्चित करने के लिए कि हम अपने कस्टम निर्देशन की प्राथमिकता उच्च संख्या पर निर्धारित करते हैं ।
जब हमारा कस्टम निर्देश संकलित किया जाता है, तो यह निर्देशों को जोड़कर और खुद को हटाकर तत्व को संशोधित करेगा और सभी निर्देशों को संकलित करने के लिए $ संकलित सेवा का उपयोग करेगा (जो कि छोड़ दिया गया था) ।
यदि हम सेट नहीं करते हैं terminal:true
और priority: 1000
, एक मौका है कि कुछ निर्देश हमारे कस्टम निर्देश से पहले संकलित किए जाते हैं । और जब हमारा कस्टम निर्देश तत्व संकलित करने के लिए $ संकलन का उपयोग करता है => पहले से संकलित निर्देशों को फिर से संकलित करता है। यह अप्रत्याशित व्यवहार का कारण होगा, खासकर अगर हमारे कस्टम निर्देश पहले ही संकलित किए गए निर्देशों को डोम में बदल चुके हैं।
प्राथमिकता और टर्मिनल के बारे में अधिक जानकारी के लिए, निर्देश के `टर्मिनल` को कैसे समझें?
निर्देश का एक उदाहरण जो टेम्पलेट को भी संशोधित करता है ng-repeat
(प्राथमिकता = 1000), जब ng-repeat
संकलित किया जाता है, ng-repeat
तो अन्य निर्देशों को लागू करने से पहले टेम्पलेट तत्व की प्रतियां बनाएं ।
@ इज़्हाकी की टिप्पणी के लिए, यहाँ ngRepeat
स्रोत कोड का संदर्भ दिया गया है : https://github.com/angular/angular.js/blob/master/src/ng/directive/ngRepeat.js
RangeError: Maximum call stack size exceeded
जैसा कि यह हमेशा के लिए संकलित होता है।