没有收到从.AS类触发的事件

时间:2010-07-16 03:44:36

标签: flex actionscript adobe mxml

我有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");         
}

1 个答案:

答案 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.

就个人而言,我想不出很多我想要这样做的场景:考虑一些重新设计,以便在构造函数返回后监听事件。