Flash的AS3主文档类作为dispatchEvent中继

时间:2012-12-26 23:12:29

标签: actionscript-3 flash events listener dispatcher

我需要DisplayObject层次结构顶部的事件redispatcher。

从我的other questions建立的简单情况:

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上实施什么才能使其成为从孩子到其他孩子的派遣事件的接力?

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

3 个答案:

答案 0 :(得分:0)

ClassB

你应该addEventListener到主要内容,例如var main是否是对主要类的引用,

  

main.addEventListener(“myEventType”,myFunction);

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

答案 1 :(得分:0)

你真的不希望通过Main修补所有活动,你只想通过某些东西修补它们。这个词的术语是事件总线

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

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

答案 2 :(得分:0)

解决方案#1:

主:

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

ClassA的:

objectB.myFunction("success");

ClassB的:

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

解决方案#2:

主:

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

ClassA的:

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

ClassB的:

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