0

DisplayObject階層の最上位にイベント再ディスパッチャが必要です。

の他の 質問から構築された単純な状況:

public class Main extends MovieClip { // Document Class at Flash
    private var objectA:ClassA;
    private var objectB:ClassB;

    public function Main() {
        objectA = new ClassA();
        addChild(objectA);
        objectB = new ClassB();
        addChild(objectB);
    }
}

 

public class ClassA extends Sprite {
    public function ClassA() {
        addChild(new Bitmap(new BitmapData(20, 20, false, 0))); // A black square
        addEventListener(MouseEvent.CLICK, clickedA);
    }

    public function clickedA(evt:MouseEvent):void {
        dispatchEvent(new TextEvent("myEventType", true, false, "success"));
    }
}

 

public class ClassB extends Sprite {
    public function ClassB() {
        addEventListener("myEventType", myFunction);
    }

    public function myFunction(evt:TextEvent):void {
        trace(evt.text);
        var color:uint = evt.text == "success" ? 0x00FF00 : 0xFF0000;
        addChild(new Bitmap(new BitmapData(20, 20, false, color)));
    }
}

myFunctionを通じてディスパッチに反応する必要がありMainます。

Main子から他の子へのディスパッチされたイベントのリレーとして機能させるには、何を実装する必要がありますか?

ディスパッチャーおよびレシーバー/リスナーとして多くの子を持つことができると考えてください。つまり、すべてのケースに 1 つのリレーを実装する必要がないように、汎用的でなければなりません。

4

3 に答える 3

0

メインクラスへの参照である場合など、メインへのClassB必要があります。addEventListenervar main

main.addEventListener("myEventType", myFunction);

良い解決策になります。

于 2012-12-27T00:10:17.220 に答える
0

を介してすべてのイベントにパッチを適用する必要はありませんMain。何かを介してパッチを適用したいだけです。その何かの用語はイベントバスです。

いくつかのスタンドアロン イベント バスの実装 ( as3commons-event-busなど) があります。または、完全な MVC フレームワーク (RobotLegs、PureMVC など) に移行することもできます。

イベントバスを利用することが良いことかどうかについては、人によって意見が分かれます。これは分離された通信 (プロ) には便利ですが、通常は誰もがサブスクライブする大きなシングルトンです (コン)。

于 2012-12-27T00:12:50.293 に答える
0

解決策 1:

主要:

objectB = new ClassB();
objectA = new ClassA(objectB);

クラスA:

objectB.myFunction("success");

クラスB:

public function myFunction(text:String):void {/*...*/}

解決策 2:

主要:

public var objectB:ClassB;
//objectB.name = "b";

クラスA:

var main = root;
//var main = stage.getChildAt(0);
//var main = stage.getChildByName("root1");

Main(main).objectB.myFunction("success");
//ClassB(Main(main).getChildByName("b")).myFunction("success");

クラスB:

public function myFunction(text:String):void {/*...*/}
于 2012-12-27T05:55:48.360 に答える