2016-05-05 11 views
9

मैं एक निर्देश चाहता हूं जो घटक के tag name की जांच करता है और कुछ हालत शो/घटक को छुपाता है। मैं ng-if (घटक के नियंत्रक प्रारंभ नहीं) की तरह व्यवहार करने के लिए छुपा दिखाना चाहता हूं। उदाहरण:कोणीय एनजी-अगर निर्देश की तरह

<my-component custom-if></my-component> 

निर्देश custom-if के अंदर:

return { 
    compile: function($element) { 
    if($element[0].tagName === 'some condition'){ 
     //Element is my-component 
     $element.remove(); 
    } 
    } 
}; 

समस्या मेरे पास है कि भले ही मैं तत्व को दूर यह अभी भी नियंत्रक मेरी घटक के कॉल है। वही होता है यदि मैं compile या preLink निर्देश के कार्य के अंदर तत्व को हटा देता हूं। बदली गई postLink समारोह: मैं भी ng-if वारिस करने की कोशिश की, लेकिन मैं नहीं है क्योंकि तत्व एक comment है custom-if निर्देश के अंदर घटक के टैग नाम प्राप्त कर सकते हैं

अद्यतन (शायद यह टिप्पणी अंदर तत्व रैप करने के लिए ng-if विशिष्ट व्यवहार है) यह सुनिश्चित करने के लिए compile पर भी यह काम नहीं करता है। यह/तत्व को छुपाता है लेकिन यह हमेशा नियंत्रक को दर्शाता है, भले ही वह निकाल दिया जाता है और वह है क्या मैं

+0

इसके बजाय लिंक में आपका तर्क करने का यह संकलन करने के लिए कदम। ऐसा करने से आपको उस तत्व को डीओएम से निकालने की अनुमति मिलनी चाहिए और उस तत्व को जोड़ने से भी बाहर कर देना चाहिए। –

+0

यह मदद नहीं करता है। मैंने इसे प्रश्न – jonasnas

+0

के अंदर लिखा है ठीक है लेकिन कुंजी संकलन फ़ंक्शन में टेम्पलेट संकलन के लिंक चरण को छोड़ने के लिए $ कंपाइलर को बताना है। और कंपाइलर हमेशा लिंक फ़ंक्शन देता है जो हमेशा नियंत्रक तक पहुंच (चौथे तर्क के रूप में) होगा, जब तक कि आप संकलन पर रुक जाएंगे, आपको हमेशा नियंत्रक मिल जाएगा। अच्छा सवाल बीटीडब्ल्यू। –

उत्तर

9

से बचने के लिए चाहता हूँ से पता चलता मुझे लगता है कि आप customIf hight प्राथमिकता निर्देश बनाकर यह करने के लिए सक्षम होना चाहिए। फिर संकलन समारोह में, आप जांच सकते हैं कि मेजबान घटक/निर्देश जारी रखने की अनुमति है या नहीं। यदि नहीं, customIf बस तत्व को पूरी तरह से हटा देता है। यदि चेक पास होता है, तो customIf को अपनी विशेषता को अनसेट करके स्वयं को हटाने की आवश्यकता होती है और उसके बाद फिर से तत्व को पुन: संकलित किया जाता है।

कुछ इस तरह:

.directive('customIf', function($compile) { 
    return { 
    priority: 1000000, 
    terminal: true, 
    compile: function(element, attrs) { 

     if (element[0].tagName === 'MY-COMPONENT') { 
     element.remove(); 
     } 
     else { 
     // remove customIf directive and recompile 
     attrs.$set('customIf', null); 
     return function(scope, element) { 
      $compile(element)(scope); 
     } 
     } 
    } 
    }; 
}); 

डेमो:http://plnkr.co/edit/Y64i7K4vKCF1z3md6LES?p=preview

+0

इन तथ्य, 'प्राथमिकता: 1' पर्याप्त होगा। [plunker] (https://plnkr.co/edit/AnlxqenYQOXjOiFdWOvi?p=preview) – Daniel

+1

@ Daniel तो यह काम नहीं करेगा यदि 'myComponent' की उच्च प्राथमिकता है। ऐसे कुछ निर्देश हैं जिनकी प्राथमिकता 1 से अधिक है। लेकिन हम अभी भी कस्टम चाहते हैं अगर उनमें से सभी के लिए पहले निष्पादित किया जाए। – dfsq

+0

क्या मैं संकलन से 'कस्टम-if = "$ ctrl.smth" 'के मान तक पहुंच सकता हूं? उदाहरण के लिए यदि मैं अंदर संकलित फ़ंक्शन को जांचना चाहता हूं 'अगर ($ ctrl.smth [$ element [0] .tagName]) ' – jonasnas

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