Apache flex 在类之间调度事件
我有一个自定义的事件类Apache flex 在类之间调度事件,apache-flex,actionscript-3,events,Apache 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, cancelabl
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应用程序的子类。还要侦听父MXML应用程序中的事件不起作用。在分派类中侦听事件本身以某种方式起作用
我不得不感觉EventDispatcher类不是将事件分派到mxml应用程序的合适类,也不是从mxml组件类扩展/固有的类
有人能帮我吗 马丁
问题是侦听器侦听本身,而不是侦听事件调度器。以下是正确的代码:
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");
}
}
注:如果你试图使用冒泡,请参阅文档中的相应部分。在这里它不起作用,因为事件“泡泡”仅出现在显示列表中,而ToneGenerator不是可视对象(精灵、MovieClip等)。您应该在调度程序上侦听事件。在您的情况下,
ToneGenerator
的一个实例正在调度事件,而SpectrumVisualizer
正在侦听-它无法工作
在分派类中侦听事件本身以某种方式起作用
这是唯一可行的办法
当你打电话的时候
this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
您告诉this
对象调用this.draw
方法,只要它(this对象)调度类型为FFTDrawEvent.draw\u event
的事件。换成
toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
现在,您告诉toneGen
对象调用this.draw
方法,只要它(toneGen
对象)调度类型为FFTDrawEvent.draw\u event
的事件
您还可以从父mxml执行以下操作
toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, specVis.draw);
每当
toneGen
对象分派类型为FFTDrawEvent的事件时,调用specVis.draw
方法。draw\u event
冒泡在非可视对象上不起作用太糟糕了。这对我来说是一个松散耦合我的类的好方法。我就是这样做的。但另一方面,我正在失去这两个类的松散耦合。现在,ToneGenerator是SpectrumVisualizer的一个实例。但无论如何,它是这样工作的,结果更重要。谢谢。@Martin“现在ToneGenerator是SpectrumVisualizer的一个实例”你为什么要这么做?让它们保持独立,并从包含这两个侦听器的父级添加侦听器。从某种意义上说,事件是类的公共接口的一部分,所以这样做没有错。