我在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。
谁能告诉我我做错了什么?
答案 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的答案标记为正确,因为它给了我一个方向。