Как реализовать пользовательские события? - PullRequest
0 голосов
/ 12 мая 2011

Как правильно реализовать пользовательские события?Я думал, что следующее должно работать, но я никогда не получаю CustomEvent.READY в основной Model

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 ]

1 голос
/ 12 мая 2011
_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]);

        }

Я вытащил это из действующего проекта ... но вы должны быть в состоянии собрать важные биты ... Удачи!

0 голосов
/ 12 мая 2011

Я не вижу ничего плохого в коде. Просто для проверки попробуйте добавить этот оператор в конце метода initWorld ():

_worldModel.dispatchEvent(new Event(CustomEvent.READY));

Если вызывается ваш метод update (), это будет означать, что существующий метод dispatchEvent () не вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...