Flex 4.5 Не прослушивает пользовательское событие, отправленное в пользовательском классе AS - PullRequest
0 голосов
/ 04 ноября 2011

У меня следующая ситуация:

У меня есть обработчик событий, который отображает небольшие сообщения в строке состояния моего приложения.Эти сообщения проходят через диспетчеризацию событий от пользовательских компонентов.Простое сообщение может выглядеть как «Ошибка HTTP» или около того.

Теперь прослушиватель основного события в главном файле приложения прослушивает событие, отправленное любым пользовательским компонентом, но, похоже, отказывается от прослушивания отправленных событий.с помощью пользовательских классов AS.

Вот мой код для пользовательского события:

package main.events
{
    import flash.events.Event;

    public class ShowNoticeEvent extends Event
    {
        public var message:String;
        public static const SHOW_NOTICE:String = "showNotice";

        public function ShowNoticeEvent(type:String, msg:String, bubbles:Boolean = false, cancelable:Boolean = false)
        {
            super(type, bubbles, cancelable);
            this.message = msg;
        }

        override public function clone():Event
        {
            return new ShowNoticeEvent(type, message);
        }
    }
}

Это прослушиватель событий в главном файле приложения:

addEventListener(ShowNoticeEvent.SHOW_NOTICE, showNoticeListener, true);

Иэто пользовательский класс AS, который отправляет пользовательское событие.Я вставил весь код, чтобы вы могли видеть всю его часть.

   package components.dashboard
{
    import components.dashboard.models.*;

    /* Event imports */
    import flash.events.*;
    import main.events.*;

    import mx.controls.Alert;
    import mx.core.UIComponent;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.http.HTTPService;

    [Event(name="showNotice", type="main.events.ShowNoticeEvent")]
    public class Controller extends UIComponent
    {
        private var baseUrl:String;

        public function Controller(baseUrl:String)
        {
            this.baseUrl = baseUrl;
        }

        public function getRunningQuotations():void
        {
            var runningQuotationsList:RunningQuotationsList = RunningQuotationsList.getInstance();

            execService("index.php?a=1", runningQuotationsList.updateList, "pnlRunningQuotations"); 
        }

        public function getRecentProjects():void
        {
            var recentProjectsList:RecentProjectsList = RecentProjectsList.getInstance();

            execService("index.php?a=2", recentProjectsList.updateList, "pnlRecentProjects");
        }

        public function getLatestCustomers():void
        {
            var latestCustomersList:LatestCustomersList = LatestCustomersList.getInstance();

            execService("index.php?a=3", latestCustomersList.updateList, "pnlLatestCustomers");
        }

        private function execService(url:String, listener:Function, component:String):void
        {
            var basicService:HTTPService = new HTTPService(baseUrl);
            basicService.showBusyCursor = true;
            basicService.addEventListener(FaultEvent.FAULT, function(e:FaultEvent):void{httpFault(e, component)});
            basicService.method = "POST";
            basicService.resultFormat = "text";
            basicService.url = url;
            basicService.addEventListener(ResultEvent.RESULT, listener);
            basicService.send();            
        }

        private function httpFault(event:FaultEvent, component:String = null):void {
            var faultstring:String = event.fault.faultString;
            var eventObj:ShowNoticeEvent = new ShowNoticeEvent(ShowNoticeEvent.SHOW_NOTICE, faultstring, true); 

            dispatchEvent(eventObj);
            trace(faultstring);
        }
    }
}

Итак, чтобы подвести итог всего этого: - слушатель событий прослушивает пользовательское событие, отправляемое любым пользовательским компонентом.- Слушатель событий не слушает пользовательское событие, отправленное классом AS.

Те, кто задается вопросом, действительно отправляют событие, поэтому я добавил вызов трассировки.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Экземпляр класса контроллера должен быть добавлен в stage для того, чтобы он работал.

, выполнив

addEventListener(ShowNoticeEvent.SHOW_NOTICE, showNoticeListener, true);

в основном файле, который вы добавляете слушателю на сцену.

Так что в основном вы делаете.

stage.addEventListener(ShowNoticeEvent.SHOW_NOTICE, showNoticeListener, true);

Если экземпляр контроллера не находится на сцене, вы не увидите событие.

Возможно, вы захотите заглянуть в Синглтонвведите шаблон для управления данными, так как он вполне подходит для этой настройки.

0 голосов
/ 04 ноября 2011

Main:

Controller.getLastInstance().addEventListener(ShowNoticeEvent.SHOW_NOTICE, showNoticeListener, true)

.

package components.dashboard
{
    import components.dashboard.models.*;

    /* Event imports */
    import flash.events.*;
    import main.events.*;

    import mx.controls.Alert;
    import mx.core.UIComponent;
    import mx.rpc.events.FaultEvent;
    import mx.rpc.events.ResultEvent;
    import mx.rpc.http.HTTPService;

    [Event(name="showNotice", type="main.events.ShowNoticeEvent")]
    public class Controller extends UIComponent
    {
        static public function getLastInstance():Controller { return _instance; }
        static private var _instance:Controller;
        private var baseUrl:String;

        public function Controller(baseUrl:String)
        {
            _instance = this;
            this.baseUrl = baseUrl;
        }

        public function getRunningQuotations():void
        {
            var runningQuotationsList:RunningQuotationsList = RunningQuotationsList.getInstance();

            execService("index.php?a=1", runningQuotationsList.updateList, "pnlRunningQuotations"); 
        }

        public function getRecentProjects():void
        {
            var recentProjectsList:RecentProjectsList = RecentProjectsList.getInstance();

            execService("index.php?a=2", recentProjectsList.updateList, "pnlRecentProjects");
        }

        public function getLatestCustomers():void
        {
            var latestCustomersList:LatestCustomersList = LatestCustomersList.getInstance();

            execService("index.php?a=3", latestCustomersList.updateList, "pnlLatestCustomers");
        }

        private function execService(url:String, listener:Function, component:String):void
        {
            var basicService:HTTPService = new HTTPService(baseUrl);
            basicService.showBusyCursor = true;
            basicService.addEventListener(FaultEvent.FAULT, function(e:FaultEvent):void{httpFault(e, component)});
            basicService.method = "POST";
            basicService.resultFormat = "text";
            basicService.url = url;
            basicService.addEventListener(ResultEvent.RESULT, listener);
            basicService.send();            
        }

        private function httpFault(event:FaultEvent, component:String = null):void {
            var faultstring:String = event.fault.faultString;
            var eventObj:ShowNoticeEvent = new ShowNoticeEvent(ShowNoticeEvent.SHOW_NOTICE, faultstring, true); 

            dispatchEvent(eventObj);
            trace(faultstring);
        }
    }
}

Не идеально, так как вы могли иметь только 1 из них. Но я думаю, что лучше, чем просто превращать простой EventDispatcher в DisplayObject и добавлять его на сцену просто в Просто пузырь.

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