Flex事件处理程序不工作
我在flex 3.5中创建了一个自定义事件。但是处理程序没有被调用。如何解决这个问题或者调试这个问题的方法是什么?Flex事件处理程序不工作
Event类:
package com.saneef.worldlanguages.events
{
import flash.events.Event;
public class LanguageEvent extends Event
{
public static const LANGUAGE_SELECTED:String = "LanguageSelected";
public function LanguageEvent(type:String,languageid:String)
{
super(type);
this.langid = languageid;
trace("LanguageEvent: " + this.langid);
}
public var langid:String;
override public function clone():Event {
return new LanguageEvent(type, langid);
}
}
}
调度:
private function functionOne():void
{
try{
dispatchEvent(new LanguageEvent(LanguageEvent.LANGUAGE_SELECTED,"STR"));
}
catch(e:Error)
{
trace(e.message);
}
}
在主应用程序类,事件监听:
protected function application1_initializeHandler(event:FlexEvent):void
{
this.addEventListener(LanguageEvent.LANGUAGE_SELECTED,
application1_LanguageSelectionHandler);
}
的事件处理函数:
public function application1_LanguageSelectionHandler(event:LanguageEvent):void
{
trace("application1_LanguageSelectionHandler: " + event.langid);
populate_countrya3id_languages(event.langid);
}
你的代码看起来不错。既然不能看到完整的源代码,这里有我什么两个念头可能正在进行:
你确定你发送的事件之前,您
addEventListener
调用完成?添加一些痕迹以确保在functionOne
之前打印application1_initializeHandler
。-
你的
functionOne
调用另一个不同于你的主应用程序的组件吗?如果是这样,您需要在事件的超级通话中将自定义事件的bubbles
属性设置为true。public function LanguageEvent(type:String,languageid:String,bubbles:Boolean=True) { super(type, bubbles); this.langid = languageid; trace("LanguageEvent: " + this.langid); }
见flash.events.Event
文档的构造函数调用。此外,这里有一个报价有关bubbles
参数解释here:这意味着
气泡属性
如果 事件对象在事件流的 冒泡阶段参与的事件是对气泡所述, 事件对象是 ,通过它的祖先从目标节点返回 ,直到达到舞台的 。 Event.bubbles属性 存储一个布尔值,该值指示 事件对象是否在冒泡阶段参与 。由于所有 事件都会冒泡并参与捕获和目标阶段,所有事件都会参与所有事件流程阶段的所有事件。如果 值为true,则事件对象 将参与所有三个阶段。如果 的值为false,则事件对象 不参与冒泡 阶段。
根据你的源代码,它看起来像你见过在Flex文档的“调度自定义事件”,但我会链接到它反正对未来/方便参考:http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html。
另外,请查看http://www.adnandoric.com/2008/12/29/understanding-the-flex-event-propagation/以了解事件传播系统的高级概述,以便更好地了解开发过程中发生的情况。
编辑:
根据您的意见我猜你的functionOne
通话是在一个单独的类和你的“主”的应用程序有这个类的一个实例。如果是这样的,所以你要附加在该实例上的事件侦听器,并将其委托给你的主要的application1_LanguageSelectionHandler
功能......像这样:
protected function application1_initializeHandler(event:FlexEvent):void
{
this.theInstanceThatHoldsYourFunctionOne.addEventListener(LanguageEvent.LANGUAGE_SELECTED,
application1_LanguageSelectionHandler);
}
“的addEventListener”的事件被分派前执行。我已跟踪测试过。 正如你怀疑“functionOne”在主应用程序以外的其他类中。正如你所建议的那样,我在超级类的构造函数中添加了“bubbles = true”。但它仍然不起作用。我将通过您提供的链接并尝试更多的调试。 :) – Saneef 2010-08-11 19:45:06
@Saneef:根据你的评论我已经更新了我的答案......看看它是否能为你解决。 – sdolan 2010-08-11 19:53:15
@sdolan它的工作。 :) 谢谢!现在,即使将事件侦听器添加到主应用程序(就像我之前所做的那样),我仍然怀疑,在事件传播(如adnandoric.com中显示的事件传播)中不会调用它吗? – Saneef 2010-08-11 20:11:33