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?
Odpowiedz
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 ...;)
Dzięki za wskazanie, że na back2dos! – jdecuyper
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.
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){}
}
... 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). –
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.
function a(){
mc.addEventListener(Event.ENTER_FRAME,function(){
...
}
}
function b(){
mc.removeEventListener(Event.ENTER_FRAME,function(){});
}
działa ...
Przeczytaj uważnie to pytanie. Zapytałem, jak usunąć WSZYSTKIE detektory zdarzeń z obiektu. – Soviut
Właściwie to tylko patrzyłem na to pytanie, aby rozwiązać ten problem. – andychase
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
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
Ale krótka odpowiedź brzmi: musisz zarządzać własną przy użyciu mapy hash lub czegoś podobnego. – Glenn