2009-09-21 19 views
9

Czy istnieje sposób określenia, które detektory zdarzeń są zarejestrowane w obiekcie wyświetlanym? Chcę usunąć wszystkie detektory zdarzeń z obiektu wyświetlanego, aby móc przypisać nowe na podstawie zmian kontekstu w aplikacji.Jak usunąć wszystkie detektory zdarzeń z obiektu wyświetlanego?

+0

Zasadniczo dupe z tym jednym, wcześniej zalogowany dziś: http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting -a-lista-zarejestrowanych-słuchaczy – Glenn

+2

Ale krótka odpowiedź brzmi: musisz zarządzać własną przy użyciu mapy hash lub czegoś podobnego. – Glenn

Odpowiedz

7

jeceuyper ma rację ...

boczny nie choć: DisplayObject rozciąga EventDispatcher, który już ma realizować IEventDispatcher ... tak, aby być bardziej precyzyjnym: trzeba zastąpić addEventListener i removeEventListener śledzić słuchaczy ...

kilka szczegółów technicznych: proponuję użyć Dictionary do przechowywania funkcji obsługi ... nieco wolniej do wstawiania, ale znacznie szybciej do usunięcia ... również, Dictionary obsługuje słabe referencje, co jest dość ważne w przypadku obsługi zdarzeń ... pamiętaj także, że useCapture umożliwia dodanie obsługi tego samego dwa razy ...

szczęście potem ...;)

+0

Dzięki za wskazanie, że na back2dos! – jdecuyper

4

Glenn ma rację, nie ma czegoś takiego jak metoda removeAllListener lub listAllListener. Mimo to można uczynić custum diplayObject implementować interfejs IEventDispatcher i śledzić wszystkich detektorów dodanych lub usuniętych z obiektu.

8

back2dos wspomniał podejście należy użyć, co zrobiłem, było rozszerzenie klasy MovieClip i wdrożone wszystkie rodzaje funkcji które używam codziennie, ale nie są częścią klasy movieclip. łącznie z ręcznym dla klasy 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

... z wyjątkiem włączenia typu do klucza bez włączenia wskaźnika funkcji oznacza, że ​​na obiekcie może znajdować się tylko jeden obiekt nasłuchujący danego typu. Aby umożliwić wielu detektorów, dodaj wskaźnik funkcji detektora do obiektu klucza i po prostu ustaw ten klucz na jakąś fałszywą wartość (np. 1). –

2

Jest to rodzaj hack, ale w niektórych (być może w większości przypadków), można łatwo ustawić obiekt wyświetlany na null i ponownie zainicjować go, a następnie ponownie go skonfigurować z zerowym wizualnym zakłóceniem.

Ma to dodatkową zaletę polegającą na usunięciu wszystkich detektorów zdarzeń.

Jeśli nie robisz tego w aplikacji, która ma już setki obiektów i słuchaczy, powinna działać idealnie dobrze, o ile możesz znieść rekonfigurację obiektu wyświetlanego.

Oczywiście nie powinieneś robić tego na czymś, co robi coś szalonego w konstruktorze, jak ładowanie danych.

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

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

działa ...

+0

Przeczytaj uważnie to pytanie. Zapytałem, jak usunąć WSZYSTKIE detektory zdarzeń z obiektu. – Soviut

+0

Właściwie to tylko patrzyłem na to pytanie, aby rozwiązać ten problem. – andychase

+0

To nie zadziała - anonimowa funkcja obsługi zdarzeń utworzona w ramach "funkcji b" jest innym obiektem niż anonimowa funkcja obsługi zdarzenia utworzona w ramach funkcji "funkcja a". Dlatego wywołanie 'removeEventListener' zakończy się po cichu. – ericsoco

Powiązane problemy