9


2

flexのターゲットと現在のターゲットの違いは何ですか?

フレックスのターゲットと現在のターゲットの違いを教えてください。

3 Answer


18


確かに、私もこれでいくつかの問題を抱えています。 `currentTarget`プロパティは、イベントハンドラーを登録したIEventListenerです。 「ターゲット」は、現在処理しているイベントをディスパッチしたものです。 したがって、「currentTarget」は変更されますが、「target」は変更されません。

次の例をご覧ください。

サンプルアプリ

            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);
            }

出力

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`。 イベントはチェーンを上に移動してから下に移動します。 「ターゲット」はイベントをディスパッチしたものであるため、「チャイルド」はそれをディスパッチしたため、一定でなければなりません。 「currentTarget」が変更されます。

つまり、FlexでDataGridをロールオーバーするときにチェックしたい場合、DataGridのitemRendererの1つにあるCheckboxをロールオーバーしたときを知りたいということです。 1つの方法は、 `MouseEvent.ROLL_OVER`のすべてのitemRendererのチェックボックスにEventListenerを追加することです。 もう1つの方法は、 `MouseEvent.ROLL_OVER`のDataGrid自体にEventListenerを追加し、イベントの_target_を確認することです。

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

それが私がよく `event.target`を使用する方法です。

助けてくれることを願って、ランス


1



-9


このような質問をする前に、Flexの概要については、このサイト(http://www.adobe.com/devnet/flex/videotraining/)のチュートリアルをご覧ください。 あなたの質問は1日目にカバーされます。