actionscript-3 flex actionscript event-handling event-delegation

actionscript 3 - ¿Cuál es la diferencia entre target y currenttarget en flex?



actionscript-3 event-handling (3)

¿Puede alguien decirme la diferencia entre target y currenttarget en flex?




Claro, también he tenido algunos problemas con esto. La propiedad actualTarget es IEventListener donde ha registrado el controlador de eventos. El target es el que envió el evento que está manejando actualmente. Entonces, el currentTarget cambia, el target no.

Mira el siguiente ejemplo:

Aplicación de muestra

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="addListeners()"> <mx:Script> <![CDATA[ protected function addListeners():void { greatGrandParent.addEventListener(Event.COMPLETE, completeHandler); grandParent.addEventListener(Event.COMPLETE, completeHandler); aParent.addEventListener(Event.COMPLETE, completeHandler); child.addEventListener(Event.COMPLETE, completeHandler); // dispatch event that "bubbles", second param is "true" // dispatched from child child.dispatchEvent(new Event(Event.COMPLETE, true)); } protected function completeHandler(event:Event):void { trace("target: ", event.target + ", currentTarget: ", event.currentTarget); } ]]> </mx:Script> <mx:Panel id="greatGrandParent"> <mx:Panel id="grandParent"> <mx:Panel id="aParent"> <mx:Button id="child"/> </mx:Panel> </mx:Panel> </mx:Panel> </mx:Application>

Salida

target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent.aParent.child target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent.aParent target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent.grandParent target: MyApp.greatGrandParent.grandParent.aParent.child, currentTarget: MyApp.greatGrandParent

Es un árbol simple de objetos de visualización, y cuando la aplicación está lista I:

  1. Agregue detectores para el mismo evento en cada componente del árbol.
  2. Envíe un evento arbitrario (solo para demostración). Elegí Event.COMPLETE .

Como todo ha registrado un manejador de eventos para ese mismo evento, y como he configurado las bubbles en verdadero ( new Event(type, bubbles) ), cualquier cosa en el árbol, desde niño hasta granGrandParent y más allá, que ha registrado un controlador de Event.COMPLETE para Event.COMPLETE , ejecutará ese método: completeHandler . Los eventos viajan por la cadena y vuelven a bajar. El target es el que envió el evento, por lo que desde que el child envió, debe ser constante. El currentTarget es lo que cambia.

Esto significa que, por ejemplo, si desea verificar cuándo está pasando por un DataGrid en Flex, quiere saber cuándo pasar una casilla de verificación dentro de uno de los itemRenderers en el DataGrid. Una forma es agregar EventListener en cada checkbox de ItemRenderer para MouseEvent.ROLL_OVER . Otra forma es agregar EventListener al DataGrid en sí mismo para MouseEvent.ROLL_OVER y verificar cuál es el objetivo en el evento:

protected function dataGrid_rollOverHandler(event:MouseEvent):void { // event.currentTarget is DataGrid if (event.target is CheckBox) trace("rolled over checkbox!"); }

Así es como a menudo uso event.target .

Espero que ayude, Lance