在类之间调度事件

时间:2010-06-25 08:19:30

标签: flex actionscript-3 events

我有自定义事件类

public class FFTDrawEvent extends Event {

    public static const DRAW_EVENT:String = "drawEvent";

    private var _param:Array = new Array();

    public function FFTDrawEvent(type:String, __param:Array, bubbles:Boolean=true, cancelable:Boolean=false) {
        _param = __param;
        super(type, bubbles, cancelable);
    }

    public function get param():Array {
        return _param;
    }
}

此事件由扩展EventDispatcher

的类调度
public class ToneGenerator extends EventDispatcher {

 public function someFunction():void {

 this.dispatchEvent(new FFTDrawEvent(FFTDrawEvent.DRAW_EVENT,_param));
}

另一节课听这个事件。这个类正在扩展SpriteVisualElement。

public class SpectrumVisualizer extends `SpriteVisualElement`:
{
    public function SpectrumVisualizer()
    {
        this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
    }

不幸的是,这不起作用。调度该事件(返回true),但永远不会触发事件侦听器。

两个类(Dispatcher& Listener)都是MXML应用程序的Child类。也听父MXML应用程序中的事件不起作用。在调度类本身中以某种方式监听事件。

我不得不感觉EventDispatcher类不适合将事件分派给mxml应用程序或者相应的AS类,这些类是从MXML组件类扩展/固有的。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

您应该监听调度员的事件。在您的情况下,ToneGenerator的实例正在调度该事件并且SpectrumVisualizer正在侦听 - 它将无效。

  

在调度类本身中以某种方式监听事件。

这是唯一可行的方式。

致电时

this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);

只要this对象(this.draw对象)调度this类型的事件,您就告诉FFTDrawEvent.DRAW_EVENT对象调用toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, draw); 方法。将其更改为

toneGen

现在,只要this.draw对象(toneGen对象)调度FFTDrawEvent.DRAW_EVENT类型的事件,您就告诉toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, specVis.draw); 对象调用specVis.draw方法。

您还可以从父mxml执行以下操作。

toneGen

只要FFTDrawEvent.DRAW_EVENT对象调度{{1}}类型的事件,就调用{{1}}方法。

答案 1 :(得分:1)

马丁,

问题是听众倾听本身而不是听取事件调度员。这是正确的代码:

public class SpectrumVisualizer extends SpriteVisualElement
{
    public function SpectrumVisualizer()
    {
        toneGenerator = new ToneGenerator();
        toneGenerator.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
        toneGenerator.someFunction();
    }

    private var toneGenerator:ToneGenerator;

    private function draw(event:FFTDrawEvent):void
    {
        trace("draw");
    }

}

This will help you to understand events.

P.S:如果您尝试使用冒泡,请参阅文档中的相应部分。这里不起作用,因为事件在显示列表中“冒泡”,而ToneGenerator不是可视对象(Sprite,MovieClip,...)。