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使其充当从孩子到其他孩子的调度事件的中继?

考虑它可以有许多孩子作为调度员和接收者/听众。换句话说,它必须是通用的,所以我不必为每种情况实施一个中继。

4

3 回答 3

0

ClassB你应该addEventListener对主类,例如,如果var main是对主类的引用,

main.addEventListener("myEventType", myFunction);

将是一个很好的解决方案。

于 2012-12-27T00:10:17.220 回答
0

您真的不想通过 修补所有事件Main,而只想通过某些东西修补它们。一个术语是事件总线

有一些独立的事件总线实现(例如as3commons-event-bus),或者您可以转向完整的 MVC 框架(例如 RobotLegs、PureMVC)。

对于使用事件总线是否是一件好事,人们意见不一。它对于解耦通信很方便(pro),但它通常是每个人都订阅的大单例(con)。

于 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 回答