自定义事件没有被听到

时间:2014-07-10 15:56:03

标签: actionscript-3 flex air flash-builder

我正在使用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类中的监听器永远不会触发。

谁能明白为什么?

感谢。

1 个答案:

答案 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);

这应该解决它我打赌。