Actionscript 3 如何实现自定义事件?
如何正确实现自定义事件?我认为下面的方法应该可以工作,但我从未在主模型中收到CustomEvent.READYActionscript 3 如何实现自定义事件?,actionscript-3,model-view-controller,events,Actionscript 3,Model View Controller,Events,如何正确实现自定义事件?我认为下面的方法应该可以工作,但我从未在主模型中收到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:Str
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);
}
}
}
在Model.as中,它扩展了AbstractModel,它扩展了EventDispatcher
private function initWorld():void {
_worldModel = new WorldModel();
_worldModel.addEventListener(CustomEvent.READY, update);
}
然后在WorldModel.as中,它扩展了AbstractModel,它扩展了EventDispatcher,我调度了一个事件,但从未调用过update。为什么?
dispatchEvent(new Event(CustomEvent.READY));
我看不出代码有什么问题。为了进行测试,请尝试在initWorld()方法的末尾添加以下语句: 如果调用了update()方法,则表示未调用现有的dispatchEvent()方法
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY));
必须实例化CustomEvent,而不是事件。差别很大
您还可以使用自定义事件通过已调度事件传递附加参数,如果您大量使用自定义事件,这将非常方便
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));
并在Receiving函数中将其作为数组访问
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]);
}
我从一个正常运作的项目中提取了这个。。。但是你应该能够收集重要的信息。。。
祝你好运 mmm补充说,测试按预期工作。我的dispatchEvent方法正在被调用,因为我有任何一方的跟踪,非常奇怪。但是你实际上没有使用自定义事件-只有自定义事件类中的静态常量。愚蠢的错误,我在创建侦听器之前启动了触发事件的WorldModel…非常感谢,看起来确实很有用!原来我的事件是在侦听器启动之前触发的。真的有点傻。在这种情况下,不需要分派CustomEvent类的实例。@Omer=你完全正确。由于OP的customEvent没有添加额外的功能,所以静态常量就是所需的全部(并且可以在任何地方保存)。然而,在本例中,问题是“如何实现自定义事件”,而不是“如何使用静态常量”。。。
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]);
}