Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何实现自定义事件?_Actionscript 3_Model View Controller_Events - Fatal编程技术网

Actionscript 3 如何实现自定义事件?

Actionscript 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

如何正确实现自定义事件?我认为下面的方法应该可以工作,但我从未在主模型中收到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);
    }
}
}
在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]);

        }