2016-02-25 11 views
5

मैं ngAttr का उपयोग कर सशर्त रूप से एक सरल निर्देश लागू करना चाहता हूं। मुझे समझ में नहीं आता कि मेरा निर्देश हमेशा क्यों प्रदर्शित होता है। तो अगर मेरे पास अपरिभाषित/झूठा वैरिएबल है, तो मैं अपना निर्देश लागू करना चाहता हूं: dirrAngularJS में सशर्त रूप से निर्देश कैसे लागू करें?

ngAttr, $ के allOrNothing ध्वज का उपयोग करते हैं, को जोड़ प्रयोग किया जाता है, इसलिए यदि अपरिभाषित में अंतर्वेशित स्ट्रिंग परिणामों में किसी भी अभिव्यक्ति, विशेषता निकाल दिया जाता है और तत्व को नहीं जोड़ा गया।

My code pen

<div ng-app="myApp" ng-controller="MainController" class="container-fluid"> 
    <h2 ng-bind="currentVersion"></h2> 
    <hr> 
    <div ng-attr-dirr="hidden || undefined">Default div</div> 
</div> 

angular.module('myApp',[]) 
.directive('dirr', function(){ 
    return { 
    restrict:'AE', 
    template:'<div>Div from directive</div>' 
    } 
}) 
.controller('MainController',['$scope', function($scope){ 
    $scope.currentVersion = 'Angular 1.3.6'; 
    $scope.hidden = undefined; 
}]) 
; 
+2

FYI करें आप अपने खुद के चर नामकरण से बचना चाहिए, निर्देश 'आदि' नामस्थान ('$ scope.ngVar') के तहत। कोर कोणीय घटकों के लिए Thats और भविष्य के डेवलपर्स के लिए भ्रम पैदा कर सकता है। – ste2425

+0

@ ste2425 यह एक तेज़ उदाहरण है, कृपया विषय पर रहें !! – que1326

+2

वह कहते हैं "एफवाईआई" साइड नोट के रूप में, "मैं विषय पर हूं" नहीं! –

उत्तर

0

जवाब सही हैं और नमूना कोड आप छोटे मुद्दों के लिए काम करता है प्रदान की है, लेकिन आप इस दृष्टिकोण लेने के लिए चाहते हो सकता है जब यह बड़ी आवेदनों पर इस समस्या को हल आता है:

Updated Pen

<div ng-app="myApp" ng-controller="MainController" class="container-fluid"> 
    <h2 ng-bind="currentVersion"></h2> 
    <hr> 
    <div dirr value="{{hidden}}">Default div</div> 
    </div> 

.directive('dirr', function($log){ 
    var directiveInstance = { 
    restrict:'AE', 
    scope:{ 
     value:'@' 
    }, 
    link: function (scope, element, attrs, ctrl) { 
     if(attrs.value === 'true'){ 
     console.log('directive on !!'); 
     $log.debug('element',element); 
     element[0].innerHTML = '<div>hello ' + attrs.value + '</div>'; 
     } 
     else { 
     console.log('directive off !!'); 
     } 
    } 
    } 
    return directiveInstance; 
}) 

यह और अधिक साफ है और आप जब आप की तरह कुछ है अपने कोड ngIf या अलग divs में ngSwitch निर्देशों का उपयोग कर नकल करने नहीं चाहते हो सकता है:

<table> 
    <thead dirr value="{{statement}}"> 
    <tr> 
    <th> 
     CrazyStuffHere... 
    </th> 
    <th> 
     CrazyStuffHere... 
    </th> 
    .... 
    </tr> 
    </thead> 
</table> 
+0

आपके जोड़े गए HTML में किसी भी कोणीय बाइंडिंग को बाध्य नहीं किया जाएगा।आपको '$ compile' सेवा का उपयोग करने की आवश्यकता होगी, jquery/jqlite नहीं। – ste2425

+0

@ ste2425 उदाहरण प्रदान करते हैं, मुझे यकीन नहीं है कि आपका क्या मतलब है। – que1326

+1

उम्मीद है कि इससे मदद मिलेगी। https://jsfiddle.net/q9cqquLe/ यह तर्क प्रत्येक निर्देश में नहीं होना बेहतर हो सकता है, लेकिन एक ही उपयोगिता है जो आपके लिए तर्कसंगत रूप से आवेदन करने के लिए निर्देश नाम पारित करने के लिए यह तर्क करता है। – ste2425

4

आप हालत के लिए जाँच करें और यह सशर्त निष्पादित करने के लिए AngularJS के इनबिल्ट निर्देश ng-if का उपयोग कर सकते।

उदाहरण:

<div ng-if="{some_condition}"> 
    <dirr></dirr> <!--Execute the directive on the basis of outcome of the if condition--> 
</div> 
+0

मैं अपने संदर्भ में – que1326

+0

क्यों एनजी का उपयोग नहीं कर सकता, क्यों समस्या है? या 'एनजी-स्विच 'के साथ जाओ। – Shashank

+0

मैंने थ्रेड उत्तर के साथ जवाब दिया। – que1326

1

फार्म प्रलेखन

कोणीय द्वारा प्रदत्त निर्देशों से मेल नहीं खाता नाम, टैग नाम, टिप्पणियाँ, या वर्ग के नाम

तो जब भी विशेषता कोणीय विशेषता नाम के साथ एक गंभीरता से मेल खाता है, यह टेम्पलेट संकलित करता है और इसके बावजूद एचटीएमएल प्रस्तुत करता है मान बताइए।

वैसे भी आप गुंजाइश के छिपे संपत्ति के साथ template.so उपयोग एनजी-हाइड निर्देश में गुंजाइश का उपयोग कर सकते

angular.module ('MyApp', [])

.directive('dirr',function(){ 
    return{ 
     restrict:'AE', 
     template:'<div ng-hide="hidden">Div from directive</div>', 
    } 
}) 
.controller('MainController',['$scope', function($scope){ 
    $scope.hidden=false; 
}]); 
संबंधित मुद्दे