2009-09-21 18 views
9

क्या यह निर्धारित करने का कोई तरीका है कि कौन सा ईवेंट श्रोताओं को प्रदर्शन ऑब्जेक्ट के साथ पंजीकृत किया गया है? मैं एक प्रदर्शन ऑब्जेक्ट से सभी ईवेंट श्रोताओं को हटाना चाहता हूं ताकि मैं एप्लिकेशन में संदर्भ परिवर्तनों के आधार पर नए को असाइन कर सकूं।प्रदर्शन ईवेंट से सभी ईवेंट श्रोताओं को कैसे हटाएं?

+0

मूल रूप से इस एक का एक शिकार, लॉग ऑन आज पहले: http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting -ए-सूची-पंजीकृत-श्रोताओं – Glenn

+2

लेकिन संक्षिप्त उत्तर यह है कि आपको हैश मानचित्र या कुछ का उपयोग करके अपना प्रबंधन करना होगा। – Glenn

उत्तर

7

jeceuyper सही है ...

एक पक्ष नहीं है, हालांकि: DisplayObjectEventDispatcher, जो पहले से ही IEventDispatcher को लागू करता है फैली हुई है ... इसलिए अधिक स्पष्ट होने के: आप श्रोताओं का ट्रैक रखने के addEventListener और removeEventListener ओवरराइड करने के लिए की जरूरत है ...

में कुछ तकनीकी जानकारी: मैं प्रविष्टि के लिए सुझाव है कि आप Dictionary का उपयोग हैंडलर कार्यों स्टोर करने के लिए ... कुछ धीमा है, लेकिन बहुत तेजी से हटाने के लिए ... भी, Dictionary कमजोर संदर्भ जो काफी महत्वपूर्ण है का समर्थन करता है, इवेंट हैंडलिंग के मामले में ... ध्यान रखें, useCapture फिर ... दो बार एक ही हैंडलर जोड़ने के ...

अच्छी किस्मत की अनुमति देता है;)

+0

बैक 2 डीओएस को इंगित करने के लिए धन्यवाद! – jdecuyper

4

ग्लेन सही है, निकालने के लिए कोई भी चीज़ नहीं है AllListener या listAllListener विधि। फिर भी, आप अपने custum diplayObject को IEventDispatcher इंटरफ़ेस को कार्यान्वित कर सकते हैं और अपने ऑब्जेक्ट से जोड़े गए या हटाए गए सभी श्रोताओं का ट्रैक रख सकते हैं।

8

back2dos दृष्टिकोण का उपयोग करना चाहिए उल्लेख किया है, क्या मैंने किया movieclip वर्ग का विस्तार था और कार्यों के सभी प्रकार लागू किया कि मैं दैनिक आधार पर उपयोग करता हूं लेकिन फिल्म क्लिप वर्ग का हिस्सा नहीं हूं। addEventListener वर्ग

protected var listeners : Dictionary = new Dictionary(); 
override public function addEventListener(type : String, listener : Function, useCapture : Boolean = false, priority : int = 0, useWeakReference : Boolean = true) : void 
{ 
     var key : Object = {type:type,useCapture:useCapture}; 
     if(listeners[ key ]) { 
       removeEventListener(type, listeners[ key ], useCapture); 
       listeners[ key ] = null; 
     } 
     listeners[ key ] = listener; 

     super.addEventListener(type, listener, useCapture, priority, useWeakReference); 
} 
protected function removeListeners() : void 
{ 
     try 
     { 
      for (var key:Object in listeners) { 
        removeEventListener(key.type, listeners[ key ], key.useCapture); 
         listeners[ key ] = null; 
      } 
     }catch(e:Error){} 
} 
+0

... फ़ंक्शन पॉइंटर को शामिल किए बिना कुंजी में शामिल करने को छोड़कर इसका मतलब है कि आप ऑब्जेक्ट पर दिए गए प्रकार के केवल एक श्रोता को प्राप्त कर सकते हैं। एकाधिक श्रोताओं को अनुमति देने के लिए, मुख्य ऑब्जेक्ट में श्रोता फ़ंक्शन पॉइंटर जोड़ें और केवल उस कुंजी को कुछ डमी मान (उदा। 1) पर सेट करें। –

2

यह एक हैक की तरह है, लेकिन कुछ (शायद ज्यादातर मामलों) में, आप आसानी से शून्य पर है और यह फिर से प्रारंभ और फिर उसे पुन: कॉन्फ़िगर प्रदर्शन वस्तु निर्धारित कर सकते हैं के लिए ओवरराइड सहित शून्य दृश्य व्यवधान के साथ।

इसमें सभी ईवेंट श्रोताओं को हटाने का अतिरिक्त बोनस है।

जब तक आप इस ऐप में ऐसा नहीं कर रहे हैं जिसमें पहले से ही सैकड़ों श्रोताओं और ऑब्जेक्ट्स हैं तो इसे पूरी तरह ठीक काम करना चाहिए जब तक कि आप अपनी प्रदर्शन ऑब्जेक्ट को पुन: कॉन्फ़िगर कर सकें।

जाहिर है, आपको ऐसा कुछ भी नहीं करना चाहिए जो डेटा लोड करने जैसे निर्माता में पागल हो।

-1
function a(){ 
    mc.addEventListener(Event.ENTER_FRAME,function(){ 
         ... 
         } 
} 

function b(){ 
    mc.removeEventListener(Event.ENTER_FRAME,function(){}); 
} 

काम करता है ...

+0

प्रश्न को और सावधानीपूर्वक पढ़ें। मैंने पूछा कि ऑब्जेक्ट से सभी ईवेंट श्रोताओं को कैसे हटाया जाए। – Soviut

+0

मैं वास्तव में इस समस्या को हल करने के लिए केवल इस प्रश्न को देख रहा था। – andychase

+0

यह काम नहीं करेगा - 'फ़ंक्शन बी' के भीतर बनाए गए अज्ञात ईवेंट हैंडलर फ़ंक्शन 'फ़ंक्शन ए' के ​​भीतर बनाए गए अज्ञात ईवेंट हैंडलर फ़ंक्शन की तुलना में एक अलग ऑब्जेक्ट है। इसलिए, 'removeEventListener' कॉल चुपचाप विफल हो जाएगा। – ericsoco

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