2009-09-21 11 views
9

¿Hay alguna forma de determinar qué detectores de eventos están registrados con un objeto de visualización? Quiero eliminar todos los detectores de eventos de un objeto de visualización para poder asignar nuevos en función de los cambios de contexto en la aplicación.¿Cómo eliminar todos los detectores de eventos de un objeto de visualización?

+0

Básicamente un duplicado de éste, registran el día de hoy: http://stackoverflow.com/questions/1452539/flash-as3-eventdispatcher-any-way-of-getting -a-list-of-registered-listeners – Glenn

+2

Pero la respuesta corta es que tienes que administrar la tuya usando un hash map o algo así. – Glenn

Respuesta

7

jeceuyper es correcto ...

un lado, no sin embargo: DisplayObject extiende EventDispatcher, que ya no implementar IEventDispatcher ... así que para ser más precisos: se debe redefinir addEventListener y removeEventListener para realizar un seguimiento de los oyentes ...

algunos detalles técnicos: sugiero que use Dictionary para almacenar las funciones del controlador ... un poco más lento para la inserción, pero mucho más rápido para la eliminación ... también, Dictionary admite referencias débiles, que es bastante importante en el caso del manejo de eventos ... también tenga en cuenta que useCapture permite agregar el mismo controlador de doble ...

buena suerte entonces ...;)

+0

¡Gracias por señalar eso en back2dos! – jdecuyper

4

Glenn tiene razón, no existe tal método como removeAllListener o listAllListener. Sin embargo, podría hacer que su cpusum diplayObject implemente la interfaz IEventDispatcher y realice un seguimiento de todos los oyentes agregados o eliminados de su objeto.

8

back2dos ha mencionado el enfoque que debe utilizar, lo que hice fue extender la clase movieclip e implementado todo tipo de funciones que uso a diario, pero que no forman parte de la clase Movieclip. incluyendo la anulación de la clase 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

... excepto que incorporar el tipo en la clave sin incorporar el puntero a la función significa que solo puede tener un oyente de un tipo determinado en el objeto. Para permitir múltiples oyentes, agregue el puntero de la función del oyente al objeto clave y simplemente establezca esa clave en algún valor ficticio (por ejemplo, 1). –

2

Esta es una especie de truco, pero en algunos (tal vez la mayoría de los casos), se puede ajustar fácilmente el objeto de visualización para anular y volver a iniciarlo y luego volver a configurarlo con cero interrupción visual.

Esto tiene la ventaja añadida de eliminar todos los oyentes del evento.

A menos que esté haciendo esto en una aplicación que ya tiene cientos de oyentes y objetos, entonces debería funcionar perfectamente bien siempre que pueda tolerar la reconfiguración de su objeto de visualización.

Obviamente, no debe hacer esto en cualquier cosa que esté haciendo algo loco en el constructor como cargar datos.

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

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

obras ...

+0

Lea la pregunta con más cuidado. Pregunté cómo eliminar TODOS los oyentes de eventos de un objeto. – Soviut

+0

En realidad, solo estaba viendo esta pregunta para resolver este problema. – andychase

+0

Esto no funcionará: la función del controlador de eventos anónimos creado dentro de 'la función b' es un objeto diferente de la función del controlador de eventos anónimos creado dentro de' la función a'. Por lo tanto, la llamada 'removeEventListener' fallará silenciosamente. – ericsoco

Cuestiones relacionadas