В чем разница между target и currenttarget во flex? - PullRequest
9 голосов
/ 25 февраля 2010

Может ли кто-нибудь сказать мне разницу между целью и текущей целью в flex?

Ответы [ 3 ]

18 голосов
/ 25 февраля 2010

Конечно, у меня тоже были проблемы с этим. Свойство currentTarget - это IEventListener, для которого вы зарегистрировали обработчик событий. target - это то, что отправило событие, которое вы обрабатываете в данный момент. Так что currentTarget меняется, target нет.

Посмотрите на следующий пример:

Пример приложения

<?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>

выход

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

Это простое дерево экранных объектов, и когда приложение готово, я:

  1. Добавить прослушиватели для одного и того же события в каждом компоненте дерева.
  2. Отправка произвольного события (только для демонстрации). Я выбрал Event.COMPLETE.

Поскольку все зарегистрировало eventHandler для того же события, и так как я установил bubbles в true (new Event(type, bubbles)), все в дереве, от дочернего до greatGrandParent и далее, зарегистрировало обработчик события для Event.COMPLETE, запустит этот метод: completeHandler. События движутся вверх по цепочке, а затем обратно вниз. target - это то, что отправило событие, поэтому, поскольку child отправило его, оно должно быть постоянным. currentTarget - это то, что меняется.

Это означает, что, скажем, вы хотите проверить, когда вы переворачиваете DataGrid во Flex, вы хотите знать, когда вы переворачиваете флажок внутри одного из itemRenderers в DataGrid. Один из способов - добавитьEventListener на каждый флажок itemRenderer для MouseEvent.ROLL_OVER. Другой способ - добавитьEventListener в сам DataGrid для MouseEvent.ROLL_OVER и проверить, что является target для события:

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

Вот так я часто использую event.target.

Надеюсь, это поможет, Lance

1 голос
/ 25 февраля 2010

Таким образом может помочь:

http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html#219548

0 голосов
/ 26 февраля 2010

Вы должны пройти обучение на этом сайте: http://www.adobe.com/devnet/flex/videotraining/ для ознакомления с Flex, прежде чем задавать такой вопрос.Ваш вопрос рассматривается в первый день.

...