0

1)まず、CustomEvent クラスを使用したくありません。CustomEventを使用せずに私が探しているいくつかの解決策。

2)解決策の1つは、ClassAにabc変数を持つことができます。そして、 ClassA を介して直接ディスパッチします( classB.dispatchEvent() と言うよりもむしろ)。しかし、これよりも良い解決策があるかどうかをまだ探しています。


//Frame1 code :
import flash.events.Event;

var classA:ClassA = new ClassA() ;

classA.addEventListener("hello", hello); 
classA.init();
function hello(e:Event)
{
    trace(e.currentTarget.abc); //<<<< NEVER EXECUTED
}

//classA
package
{
    import flash.display.MovieClip;
    import flash.events.Event;

    public class ClassA extends MovieClip 
    {

        var classB:ClassB ; 

        public function ClassA()
        {
            classB = new ClassB(); 

        }

        public function init()
        {
            classB.dispatchEvent( new Event("hello"));
        }

    }
}

//classB
package
{
    import flash.display.MovieClip;
    public class ClassB extends MovieClip
    {
        public var abc:Number =123;
        public function ClassB()
        {


        }




    }
}
4

2 に答える 2

3

例を機能させる前に、いくつかの重要な概念が欠けています。最初に のインスタンスでイベントをディスパッチしていますがClassB、 のインスタンスでリッスンしていますClassA。そのため、イベントがディスパッチされたときにイベントが適切に編成されるように、何らかの方法で関連付ける必要があります。これを行う1 つの方法は、イベント バブリングを使用することです。これに対する 1 つの注意点は、ネイティブ イベント バブリングが実際に機能するのは のみですDisplayObjectsが、両方のクラスが から継承されるMovieClipため、大したことではありません。

そのため、まず、バブリング イベントがどのように機能するかを理解する必要があります。簡単に説明すると、イベントはディスプレイ階層の最上部から始まり、ディスプレイ ツリーを要素に向かって下にキャプチャし、最終的にtargetにディスパッチされ、向きを変えて反対方向にバブルアウトします。

これは、 のインスタンスが のClassBなければならないことを意味します。したがって、最初に変更する必要があるのは、コンストラクターです。ClassAClassA

    public function ClassA()
    {
        classB = new ClassB();
        addChild(classB);
    }

次に、イベントをディスパッチするときに、バブリングイベントであることを明示的に示す必要があります。そうしないと、ターゲットでトリガーされ、ディスプレイ スタックをキャプチャしたりバブリングしたりしません。

    public function init()
    {
        classB.dispatchEvent( new Event("hello", true));
    }

の 2 番目の引数はtrue、イベントをバブリング イベントに設定します。

最後に、ハンドラーを変更する必要があります。現在、それは を使用してe.currentTargetいますが、これはこの場合に期待するものではありません (通常はそうであると考えられていました)。

と の違いを理解する必要がe.targetありe.currentTargetます。e.targetどのようにバブリングまたはキャプチャーするかに関係なく、イベントの実際のターゲットです。e.currentTarget一方、現在イベントを処理している要素です。したがって、あなたの場合e.currentTargetClassA(イベントハンドラーが実際にアタッチされているインスタンス)e.targetのインスタンスであり、ClassB(イベントがディスパッチされたインスタンス)のインスタンスです。イベントのライフサイクル中、e.currentTargetイベントが移動するにつれて変更されますe.targetが、常に同じである必要があります。

この場合、現在イベントを処理している要素ではなく、イベントの実際のターゲットを参照する必要があります。したがって、ハンドラーを次のように変更する必要があります。

function hello(e:Event)
{
    trace(e.target.abc);
}

そして、それはうまくいくはずです。ここで説明した変更をカプセル化した実用的な例を見つけることができます。

これらのクラスがそうでない場合DisplayObjectsは、シグナル パターンを使用するか、内部のイベントの再トリガーを手動でリッスンするという別のアプローチを取る必要がありますClassA

于 2012-09-10T13:56:17.140 に答える
0

まず、classAにイベントリスナーを追加していますが、classAのinitメソッドがclassBにイベントをディスパッチするように要求しているため、コードが実行されません。helloイベントをキャッチしたい場合は、次のようなことを行う必要があります

public function init()
    {
        this.dispatchEvent( new Event("hello"));
    }

または、リスナーをclassBに登録する必要があります(スコープ内にないため、コードの提案はありません)。

ActionScriptでは、情報を転送するための最良のアプローチはカスタムイベントを使用することであるため、カスタムイベントに関する決定を再評価することをお勧めします。

于 2012-09-10T12:53:14.253 に答える