如何实现自定义事件?
如何正确实现自定义事件?我认为以下应该工作,但我从来没有收到CustomEvent.READY中的主力机型如何实现自定义事件?
package mvc
{
import flash.events.Event;
public dynamic class CustomEvent extends Event
{
public static const MY_EVENT:String = "myEvent";
public static const READY:String = "ready";
public function CustomEvent(type:String)
{
super(type);
}
}
}
在延伸AbstractModel的Model.as延伸此事件
private function initWorld():void {
_worldModel = new WorldModel();
_worldModel.addEventListener(CustomEvent.READY, update);
}
然后在一个延伸WorldModel.as AbstractModel扩展了EventDispatcher,我分派了一个事件,但是更新从不被调用。为什么?
dispatchEvent(new Event(CustomEvent.READY));
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY));
你必须实例化一个自定义事件,而不是一个事件。巨大差距。
你也可以用你的自定义事件传递其他参数与调度的事件,如果你使用你的自定义事件的,这将被证明出奇得心应手严重
package com.b99.events
{
import flash.events.Event;
/**
* ...
* @author bosworth99
*/
public class AppEvents extends Event
{
public static const APP_READY :String = "application ready";
public static const XML_LOADED :String = "XML has loaded";
public static const CHANGE_COMPLETE :String = "state change complete";
public static const PAGE_ADDED :String = "page content added";
public static const PAGE_REMOVED :String = "page content removed";
public static const LIBRARY_LOADED :String = "external library loaded";
public static const IMAGE_LOADED :String = "external image loaded";
public static const LOAD_ERROR :String = "external load failed";
public var arg:*;
public function AppEvents(type:String, bubbles:Boolean = false, cancelable:Boolean = false, ...a:*)
{
super(type, bubbles, cancelable);
arg = a;
}
override public function clone():Event
{
return new AppEvents(type, bubbles, cancelable, arg);
}
}
}
然后,您可以通过任意数量的参数一起一个接收函数:
this.dispatchEvent(new AppEvents(AppEvents.LIBRARY_LOADED, false , false, _name, _library, _names));
并在接收函数中以数组的形式访问它们。
private function onLibraryLoad(e:AppEvents):void
{
_digestExternalLib.removeEventListener(AppEvents.LIBRARY_LOADED, onLibraryLoad);
var currentIndex:int = AppData.navLocations.indexOf(e.arg[0], 0);
AppData.libraries.push(e.arg[0]);
AppData.libraryCon.push(e.arg[1]);
AppData.libraryNames.push(e.arg[2]);
}
我猛拉这从运作项目......但你应该能够收集重要的位...... 祝你好运!
我真的没有看到任何错误的代码。只是为了测试,尝试initWorld的末尾添加这一说法()方法:
_worldModel.dispatchEvent(new Event(CustomEvent.READY));
如果你的update()方法被调用时,这将表明,现有的dispatchEvent()方法不会被调用。
mmm添加该测试按预期工作。我的dispatchEvent方法被调用,因为我有任何一方的痕迹,很奇怪。 – davivid 2011-05-12 14:26:59
但是,您并没有真正使用您的自定义事件 - 只有在自定义事件类中找到的静态常量。 – Bosworth99 2011-05-12 14:31:41
愚蠢的错误,我正在启动WorldModel,它是在创建侦听器之前触发事件的... – davivid 2011-05-12 14:43:05
非常感谢,看起来确实非常有用!结果发现我的事件在听者发起之前就被解雇了。真的有点傻。 – davivid 2011-05-12 14:41:57
在这种情况下,不需要分派CustomEvent类的实例。 – Ohas 2011-05-12 14:43:25
@Omer =你完全正确。由于OP的customEvent没有增加额外的功能,因此静态常量是所有必需的(并且可以在任何地方保存)。然而,在这种情况下,问题是“如何实现自定义事件”,而不是“如何使用静态常量”...... – Bosworth99 2011-05-12 16:44:28