2013-05-06 17 views
11

के लिए ईवेंट मैं अपने ऐप में सभी तत्वों पर अपना छुपा देखना और अभिव्यक्ति दिखाना चाहता हूं।कोणीय - एनजी-छिपाने और एनजी-शो

मैं जानता हूँ कि मैं एक समारोह जो सिर्फ तर्क देता है के साथ इस शो के निर्देश लपेटकर द्वारा यह कर सकते हैं:

<div ng-show="catchShow(myShowExpr == 42)"></div> 

हालांकि, मैं देखना चाहते हैं उन्हें सब छिपाने/पता चलता भर में मेरे एप्लिकेशन में सभी इनपुट और उपरोक्त पर्याप्त अच्छा नहीं है।

मैं ngShow/ngHide निर्देशों को भी अधिभारित कर सकता हूं हालांकि मुझे अभिव्यक्ति का पुनर्मूल्यांकन करने की आवश्यकता होगी।

मैं भी बस के बाद से यह काफी सरल है स्रोत को संशोधित कर सकते हैं:

var ngShowDirective = ['$animator', function($animator) { 
    return function(scope, element, attr) { 
    var animate = $animator(scope, attr); 
    scope.$watch(attr.ngShow, function ngShowWatchAction(value) { 
     var fn = toBoolean(value) ? 'show' : 'hide'; 
     animate[fn](element); 
     //I could add this: 
     element.trigger(fn); 
    }); 
    }; 
}]; 

हालांकि तो मैं गूगल CDN का उपयोग नहीं कर सकता है ...

वहाँ एक अच्छा तरीका है किसी को भी के बारे में सोच सकता है यह करो ?

+1

'ng-show' – charlietfl

+0

का उपयोग करने के बजाय अपना खुद का प्रदर्शन निर्देश लिख सकता है क्या मैं पूछ सकता हूं कि व्यवसाय की आवश्यकता क्या है? मैं यह सोचने की कोशिश कर रहा हूं कि ऐसा करने का कोई बेहतर तरीका है .. –

+0

मेरे पास एक जटिल रूप है और जब कोई तत्व छिपा हुआ है, तो इसे साफ़ करने की आवश्यकता है। वर्तमान में, मैं इसे अपनी स्लाइड [एनीमेशन] में कर रहा हूं (http://code.angularjs.org/1.1.4/docs/api/angular.Module)। हालांकि अगर मैं किसी तत्व को फीका करने का निर्णय लेता हूं, या तुरंत छुपा/दिखाता हूं, तो यह जल्दी से हैकी बन जाता है। इसलिए एक घटना की आवश्यकता है। चूंकि 'एनजी-शो 'निर्देश कार्यान्वयन उचित रूप से सरल है, इसलिए मैं सिर्फ @ charlietfl के सुझाव के साथ जा सकता हूं और अपना निर्देश लागू कर सकता हूं। – jpillora

उत्तर

22

यहाँ है कि मैं क्या (CoffeeScript)

getDirective = (isHide) -> 
    ['$animator', ($animator) -> 
    (scope, element, attr) -> 
     animate = $animator(scope, attr) 
     last = null 
     scope.$watch attr.oaShow, (value) -> 
     value = not value if isHide 
     action = if value then "show" else "hide" 
     if action isnt last 
      scope.$emit 'elementVisibility', { element, action } 
      animate[action] element 
     last = action 
    ] 

App.directive 'oaShow', getDirective(false) 
App.directive 'oaHide', getDirective(true) 

परिवर्तित जावास्क्रिप्ट को ले कर आए हैं:

var getDirective = function(isHide) { 

    return ['$animator', function($animator) { 
    //linker function 
    return function(scope, element, attr) { 

     var animate, last; 
     animate = $animator(scope, attr); 
     last = null; 

     return scope.$watch(attr.oaShow, function(value) { 
     var action; 
     if (isHide) 
      value = !value; 

     action = value ? "show" : "hide"; 

     if (action !== last) { 
      scope.$emit('elementVisibility', { 
      element: element, 
      action: action 
      }); 
      animate[action](element); 
     } 

     return last = action; 
     }); 
    }; 
    }]; 
}; 

App.directive('oaShow', getDirective(false)); 
App.directive('oaHide', getDirective(true)); 
+18

मैं ओपी हूं ... पोस्ट करने से पहले खातों को देखें। – jpillora

+2

"कॉफ़ीस्क्रिप्ट" टैग प्रश्न में जोड़ा गया। डाउनवोट उत्तर पर छोड़ दिया। :) –

+11

उत्तर में कॉफीस्क्रिप्ट को शामिल करने के लिए नीचे मतदान? ओ अच्छा। नफ़रत करने वाले नफ़रत ही करेंगे। – jpillora

0

एक और तरीका है दृष्टिकोण ngShow की विशेषता $watch है - हालांकि यह करने की आवश्यकता होगी निर्देश के तहत किया जाना चाहिए (उपयोगी यदि आप पहले से ही कस्टम निर्देश दिखा रहे हैं/छुपा रहे हैं)

scope.$watch attrs.ngShow, (shown) -> 
    if shown 
    # Do something if we're displaying 
    else 
    # Do something else if we're hiding 
संबंधित मुद्दे