Flex自定义事件调度

时间:2010-10-10 20:34:41

标签: flex actionscript-3 flex4 flash-builder

我在flex中有一个关于事件调度的问题。

我的目标是让一个自定义事件加载一些数据,而不是冒泡到eventlistener。

我的主应用程序有和AMF服务请求里面调用服务类。当AMF服务请求返回结果或错误并且主应用程序正在侦听该事件时,该类应该调度事件。

所以在我的mainapp里面我添加和监听这样:

this.addEventListener("UserInfoEvent", userInfoHandler);

自定义UserInfoEvent.as看起来像这样

package events
{
 import flash.events.Event;

 import logic.Ego;

 public class UserInfoEvent extends Event
 {
  private var ego:Ego;

  public function UserInfoEvent(type:String, ego:Ego)
  {
   super(type);
   this.ego = ego;
  }

  override public function clone():Event 
  { 
   return new UserInfoEvent(type, ego);
  } 
 }
}

最后AMF Service类中的调度程序如下所示:

private var dispatch:EventDispatcher = new EventDispatcher;  
var userInfoEvent:UserInfoEvent = new UserInfoEvent("UserInfoEvent", ego);
dispatch.dispatchEvent(userInfoEvent);

但是,此事件从未到达主要应用程序。通过调试器仔细查看它,我发现在调度事件时,它的listeners属性设置为null。

谁能告诉我我做错了什么?

5 个答案:

答案 0 :(得分:3)

我认为你的活动没有被捕获,因为它没有冒泡

而不是

super(type);

super(type, true, false);

如果使用一个参数调用Event构造函数,则对于其他两个参数,默认为false,其中一个参数为bubbles。

我认为你的另一个问题是你正在创建一个新的EventDispatcher。相反,使用您的服务类扩展EventDispatcher,然后只调用dispatch()。

答案 1 :(得分:3)

在我看来,你没有以正确的方式听取这个事件。

 // you have 
 this.addEventListener("UserInfoEvent", userInfoHandler);

 // but you dispatch the event from    
 dispatch.dispatchEvent(userInfoEvent);  

这是错误的

你需要像

这样的东西
instance_of_Dispatch.addEventListener();  // because this != dispatch

答案 2 :(得分:1)

因此,Flex中的事件由其字符串名称标识。您的Event类没有“名称”,因此它没有任何方法来识别它并在发送时匹配它。这个'name'是传递给构造函数的'type'参数的。它传统上作为静态常量存储和引用。由于您正在将类对象UserInfoEvent与字符串“UserInfoEvent”进行比较,因此它永远不会匹配并捕获这是您要处理的事件。

package events
{
    import flash.events.Event;

    import logic.Ego;

    public class UserInfoEvent extends Event
    {

        public static const MY_EVENT:String = "myEvent";
        private var ego:Ego;

        public function UserInfoEvent(type:String, ego:Ego)
        {
            super(type);
            this.ego = ego;
        }

        override public function clone():Event 
        { 
            return new UserInfoEvent(type, ego);
        } 
    }
}

然后你会使用以下方式收听/发送此事件:

dispatchEvent(new UserInfoEvent(UserInfoEvent.MY_EVENT));

addEventListener(UserInfoEvent.MY_EVENT, myEventHandler);

希望这是有道理的,我现在正在与一个令人讨厌的偏头痛作斗争,而这正在扼杀我使用单词的能力:P

答案 3 :(得分:0)

我猜你的事件调度程序正在冒泡到systemManager而不是通过主应用程序,因为你的调度程序没有作为主应用程序的子项添加。尝试将您的监听器添加到systemManager而不是主应用程序本身:

this.systemManager.addEventListener("UserInfoEvent", userInfoHandler);

答案 4 :(得分:0)

好的,所以看起来每个人都是部分正确的。

以下是整个解决方案:

MainApplication.mxml 这里重要的是,这只有在服务类扩展sprite类时才有效,否则你不能使用addEventListener方法。看起来另一种解决方案是实现IEventDispatcher

private var service:MyService = new MyService;
this.service.addEventListener(UserInfoEvent.RESULT, userInfoHandler);

UserInfoEvent.as

package events
{
    import flash.events.Event;
    import logic.user.Ego;

    public class UserInfoEvent extends Event
    {
        private var ego:Ego;
        public static var RESULT:String = "resultEvent";

        public function UserInfoEvent(type:String, ego:Ego)
        {
            super(type,  true, false);
            this.ego = ego;
        }

        override public function clone():Event 
        { 
            return new UserInfoEvent(type, ego);
        } 
    }
}

最后,如前所述,精灵扩展了MyService.as

public class MyService extends Sprite
{
...
userInfoEvent = new UserInfoEvent(UserInfoEvent.RESULT, ego);
dispatchEvent(userInfoEvent);

这样对我有用。感谢所有帮助人员,我将Adrian的答案标记为正确,因为它给了我一个方向。