我有2个文件,1个用于调度事件,1个用于接收事件(当然除了事件类本身)。
我之前已经完成了这个调度和接收文件都是mxml,但这次是the dispatching file is an actionscript class
,这次它不能正常工作。动作脚本是不同的?
这是一个愚蠢的版本
调度类会在创建事件后立即调度该事件。
public class ASClass extends UIComponent{
public function ASClass(){
dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
}
}
在我的主mxml应用程序中,我实例化ASClass
,它会在创建事件后自动调度该事件,并且主要的mxml应用程序应该收到回复。但有些东西不起作用。
protected function appCComplete(event:FlexEvent):void{
addEventListener(MyEvents.FIRE_EVENT, gotEvent);
var asClass:ASClass = new ASClass();
}
protected function gotEvent(event:MyEvents):void{
Alert.show("got event");
}
答案 0 :(得分:2)
addEventListener(MyEvents.FIRE_EVENT, gotEvent);
与
相同this.addEventListener(MyEvents.FIRE_EVENT, gotEvent);
侦听由FIRE_EVENT
对象调度的this
- 您的主要mxml应用。要侦听从asClass
对象触发的事件,您必须在该对象上调用addEventListener。
asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent);
因此,您无法侦听从构造函数触发的事件。以下代码显示了侦听asClass
对象触发的事件的正确方法(从构造函数以外的任何位置)。
protected function appCComplete(event:FlexEvent):void{
var asClass:ASClass = new ASClass();
asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent);
}
protected function gotEvent(event:MyEvents):void{
Alert.show("got event");
}
如果你仔细想想,你会发现它是有道理的。构造函数用于创建对象 - 事件订阅者通常对对象完全构建和运行后对对象发生的某些操作/更改感兴趣。
也就是说,您可以将this
或函数的引用传递给ASClass
的构造函数,然后根据需要将该函数指定为构造函数中的事件侦听器。
public class ASClass extends UIComponent{
public function ASClass(listener:Function){
this.addEventListener(MyEvents.FIRE_EVENT, listener);
dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
}
}
var asClass:ASClass = new ASClass(this.gotEvent);//pass the function.
//or
public class ASClass extends UIComponent{
public function ASClass(listenerObj:Object){
this.addEventListener(MyEvents.FIRE_EVENT, listenerObj.gotEvent);
dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT));
}
}
var asClass:ASClass = new ASClass(this);//pass the object.
就个人而言,我想不出很多我想要这样做的场景:考虑一些重新设计,以便在构造函数返回后监听事件。