1

OK、これが状況です...

いくつかの画像と 4 つのボタンを含むカスタム mxml コンポーネントがあります。コンポーネント ファイルにはclickHandler、各ボタンの for が既に含まれています。にアクセスするclickHandlerか、別の関数を作成して、ファイル内からそれらのボタンにアタッチできるようにする必要がありMain.mxmlます。オリジナルに追加する必要がありclickHandlersますか?もしそうなら、どうすれば私のMain.mxmlファイルにメソッドを適用できますか?

参考:コンポーネントには 5 つの状態があり、それぞれclickHandlerが状態間の遷移をトリガーします。

clickHandlersコンポーネント ファイルの 2 つを次に示します。

protected function submit_clickHandler():void
        {
            const state:String = currentState;
            if ( state == 'state1' ) {
                currentState='state2';
            }
            if ( state == 'state3' ) {
                currentState='state4';
                addElement(images[i]);     //The methods I want to run from 
                getStudentAnswer();        //within the Main.mxml.
                submit();                  //If I add them here, I get an
                newQuestion();             //undefined method error.
            }
            if ( state == 'state4' ) {
                currentState='state4';
            }
            if ( state == 'state5' ) {
                currentState='state4';
            }
            if ( state == 'state3' ) {
                Sequence1.play();
            }
        }

        protected function checkAnswer_clickHandler():void
        {
            const state:String = currentState;
            if ( state == 'state2' ) {
                currentState='state1';
            }
            if ( state == 'state4' ) {
                currentState='state5';
            }
        }

ありがとう、JM

4

1 に答える 1

1

ボタンのディスパッチ イベントにアクセスできる場合は、"bubbles" を "true" に設定し、Main.mxml でイベントをリッスンします。表示リストを枝を持つ階層ツリーと考えると、バブルするイベントは、最初の DisplayObject に到達するまで枝を上っていきます。途中で、各 DisplayObject をチェックして、イベントのキャプチャを待機しているかどうかを確認します。

Main がクリック イベントをリッスンし、子 Sprite インスタンスを持つ子 MovieClip インスタンスを持つ基本的な図を次に示します。Sprite インスタンスには、クリック イベントを送出する子 Button インスタンスがあります。

[オブジェクト Main] (MouseEvent.CLICK をリッスン)
      | |
      |__[対象ムービークリップ]
                | |
                |___[オブジェクト スプライト]
                          | |
                          |____[オブジェクト ボタン] (MouseEvent.CLICK をディスパッチ)

Button でディスパッチされるクリック イベントは次のようになります。

dispatchEvent(new MouseEvent(MouseEvent.CLICK, true));

Main では、イベントをリッスンするだけです。

addEventListener(MouseEvent.CLICK, clickHandler);

MouseEvent.CLICK は非常に一般的なイベントであるため、このタイプのシナリオではカスタム イベント (または少なくとも一意のイベント名) を作成して、DisplayObject が誤ったイベントをキャプチャする可能性を回避することをお勧めします。しかし、うまくいけば、これはバブリングを処理する方法のより良いアイデアを提供します.

-

バブリングがなければ、イベントをキャプチャする他の唯一の方法は、ドット構文を使用することです。面倒になる可能性があるため、この方法はお勧めしませんが、これはバブリングの概念を説明するのに役立ちます (各子 DisplayObject がパブリックであると仮定します)。

メイン: (繰り返しますが、お勧めしません)

movieClip.sprite.button.addEventListener(MouseEvent.CLICK, clickHandler);

それが役立つことを願っています!

[編集 - カスタム イベントを追加] カスタム イベント クラスは次のようになります。

package com.example.events
{
    import flash.events.Event;

    public class CustomEvent extends Event {

        public static const WITH_DATA:String = "withData";

        public var data:Object;

        public function NavEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = data;
        }
    }
}

次に、次のようなイベントをディスパッチします。

var myString:String = "buttonState";
dispatchEvent(new CustomEvent(CustomEvent.WITH_DATA, myString, true));

そして、次のようなイベントをリッスンします。

addEventListener(CustomEvent.WITH_DATA, customEventHandler);

private function customEventHandler(e:CustomEvent):void {
    trace(e.data);
}
于 2011-05-04T15:30:33.100 に答える