我需要DisplayObject
层次结构顶部的事件redispatcher。
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
上实施什么才能使其成为从孩子到其他孩子的派遣事件的接力?
考虑它可以有许多孩子作为调度员和接收者/听众。换句话说,它必须是通用的,所以我不必为每种情况实现一个继电器。
答案 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 {/*...*/}