我正在使用Flash Builder 4.6处理移动AIR项目。我正在派遣一个自定义事件,但它从未被听到过。我检查了类似的问题,但找不到能够解决这个问题的答案。在我的主mxml文件中,我在addedToStage事件中添加了监听器:
[EDIT]将监听器添加到userStatus实例。仍然没有工作。
<s:ViewNavigatorApplication
...
private var userStatus:UserStatus;
protected function addedToStageHandler(event:Event):void
{
userStatus = new UserStatus();
userStatus.addEventListener(CustomEvent.CREDENTIALS_READY, credentialsReadyHandler);
CustomEvent类:
public class CustomEvent extends Event
{
public static const CREDENTIALS_READY:String = "credentialsReady";
public function CustomEvent(customEventString:String){
super(customEventString, true, false);
}
}
在成功的服务调用之后调度CustomEvent的类:
public class UserStatus extends EventDispatcher
{
...
//event handler
private function userStatusLoaded(e:Event):void
{
var json:Object = JSON.parse(paidUserLoader.data.toString());
if(json.success == "true")
{
trace("UserStatus::this is a paid user!");
dispatchEvent(new CustomEvent(CustomEvent.CREDENTIALS_READY));
}
我可以在控制台中看到trace语句,所以我知道代码已经到了那里。但是s:ViewNavigatorApplication类中的监听器永远不会触发。
谁能明白为什么?
感谢。
答案 0 :(得分:2)
任何自定义类事件都必须覆盖clone()方法。此方法在内部自动调用,但如果它不存在(覆盖),则只有直接调度可以工作,但事件不能遍历层次结构。
编辑:nvm,由于UserStatus不是DisplayObject,因此ViewNavigatorApplication没有理由实际捕获该事件。您对如何调度事件以及应该如何工作感到困惑。只有UserStatus本身可以捕获它正在调度的事件。没有其他对象可以。如果显示列表事件传播,但对于所有非显示对象,他们需要捕获自己的调度。编辑:回答评论:
在某处某处是UserStatus实例的引用,它可能在ViewNavigatorApplication中,如果是的话,那么:
myuserstatus.addEventListener(CustomEvent.CREDENTIALS_READY, credentialsReadyHandler);
会奏效。如果它不存在,那么您需要将具有UserStatus引用的类的信息传递给ViewNavigatorApplication。这可以通过重新分配事件来完成(这是您需要覆盖clone()的地方)。
someotherclass的实例有一个对userstatus的引用,并且会监听该事件。当事件触发someotherclass实例捕获并重新分配它。 ViewNavigatorApplication直接或通过someotherclass实例引用监听该事件,最后捕获事件。
编辑:回复新编辑
让我们修复您的自定义事件类。默认情况下,您将bubbling设置为true,但只有DisplayObject可以冒泡,因此应将其设置为capture(false)
super(customEventString, false, false);
这应该解决它我打赌。