Как реализовать пользовательские события?

Как правильно реализовать пользовательские события? Я думал, что следующее должно работать, но я никогда не получаю 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, я отправляю событие, но обновление никогда не вызывается. Зачем?

dispatchEvent(new Event(CustomEvent.READY));

2 ответа

Решение
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY));

Вы должны создать экземпляр CustomEvent, а не Event. Большая разница.

Вы также можете использовать свое пользовательское событие для передачи дополнительных параметров вместе с отправленным событием, что очень удобно, если вы интенсивно используете 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));

И доступ к ним в функции получения в виде массива.

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() не вызывается.

Другие вопросы по тегам