ventajas - flash AS3 ¿cómo puedo eliminar los oyentes de eventos de escenario
flash actionscript 3.0 descargar (4)
¿Qué errores estás viendo? El nivel de anidamiento no debería tener nada que ver con eso, ya que los oyentes solo están registrados por los parámetros, por lo que siempre que llame a eliminar con los mismos tres parámetros clave que utilizó para agregar, debería estar bien.
¿Es su verdadera pregunta cómo obtener una referencia al objeto oyente para el alcance exterior? Si es así, existen varias soluciones posibles y la mejor manera de hacerlo depende de la estructura de su código.
- MarkusQ
Estoy construyendo una animación en flash y as3, tengo una función en la que agrego un stage eventListener, stage.addEventListener (Event.ENTER_FRAME, setScrollPercent, false, 0, true);
Dado que este evento se establece dentro de una función de una función, "dos funciones profundas", ¿cómo puedo restablecer todos los oyentes de eventos de escenario desde fuera de las funciones sin obtener un error?
Las mejores prácticas con los eventlisteners AS son:
- Hazlo débil (como lo has hecho, el último parámetro de addEventListener)
- Establezca el detector de eventos en nulo después de la manipulación (estrictamente hablando no es necesario si lo ha configurado como débil)
Flex no te da destructores. Tiene su propio Garbage Collector ejecutando detrás de escena la gestión de la memoria. Limpia una pieza de memoria una vez que no hay referencias a ella. Bueno, fuertes referencias. Todos los objetos por defecto tienen una fuerte referencia. Los manejadores de eventos, ya que tienden a ser un cuello de botella de rendimiento, tienen esta habilidad especial de declararse débiles, una referencia débil. Esto, por supuesto, es posible solo cuando está adjuntando los controladores de eventos utilizando la función addEventHandler()
. El GC no tiene en cuenta las referencias débiles y, por lo tanto, cuando se eliminen todas las referencias importantes, se acumularán automáticamente como basura, lo que le liberará de la tensión de tener que hacerlo manualmente. Que es lo que de otra manera harías cuando no especificas el parámetro. Por defecto, incluso los controladores se crean como referencias fuertes.
Sin embargo, marcarlos como débiles tiene un efecto secundario. Pueden desvanecerse en el aire sin que tú lo sepas. Finalmente, sabrá, pero en términos de un error desagradable. ¿Es eso lo que está causando tus problemas? Tal vez tal vez no. Tendrás que experimentar Además, será útil si puede proporcionarnos más detalles como el código de error exacto, alguna fuente.
Espero que esto ayude. Feliz flexionando :)
Debería poder usar su función anterior y usar removeEventListeners en lugar de agregar. Muy simple en realidad.
La respuesta a su pregunta, y me doy cuenta de que tenía un problema con el alcance, porque acabo de responder a una pregunta que tenía sobre el alcance, es que está trabajando con el escenario. Considere la etapa global, ya que es el lienzo en el que se dibujan todos sus objetos de visualización.
¡Lo siguiente funcionará en cualquier lugar!
stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true);
Ahora, el error del que hablas, IM GUESSING, es que simplemente configuras lo anterior para eliminar EventListener cuando estuviste listo, lo que no funciona.
La función removeEventListener NO acepta cinco parámetros como su hermano addEventListener, solo permite ignorar tres prioridades y referencias débiles, como se muestra a continuación.
//The following removes YOUR stage Event.ENTER_FRAME listener from any scope.
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false);
Espero que esto ayude, recuerde que la etapa es la raíz global en cierto sentido, y tenga cuidado con la raíz, en realidad funciona como se supone ahora en el hecho de que llamar a root ahora está relacionado con el swf desde el que lo llama, no el escenario , a menos que la etapa sea la raíz del alcance actual.