2013-12-05 2 views
0

Чтобы использовать параметры передачи в некотором случае, я использовал пользовательские события. У меня есть TabbedViewNavigatorApplication для мобильных телефонов. В котором у меня есть пара взглядов. Через определенный промежуток времени 1 из просмотров открывается окно (рейтинг приложения), в котором есть 3 варианта (1. ставка сейчас, 2. напомнить позже, 3. Не напомните).Понимание пользовательского обработчика ActionScript 3

Я создал пользовательское событие CustomMouseEvent (есть хороший сайт here for generating custom event), который может принимать дополнительный параметр типа объекта. У меня есть компонент для этого всплывающего окна RatePrompt, у которого есть обработчики кликов для 3 вариантов оценки. Эти обработчики кликов, в свою очередь, строят параметры и отправляют это настраиваемое событие в другое представление, которое может обрабатывать это отправленное событие, но каким-то образом событие не может достичь второй отправки ratingPromptHandler.

В HomeView я использую

<fx:Declarations> 
    <components:RatePrompt id="rateMessage"/> 
</fx:Declarations> 

RatePrompt компонент

<fx:Script> 
    <![CDATA[ 
     . 
     . 
     . 
     protected function okClick(event:MouseEvent):void 
     {trace("OK"); 
      var params:Object = new Object(); 
      params[Tables.RATE_REMINDER]=Tables.YES; 
      var eventToBeDispatched:CustomMouseEvent = new CustomMouseEvent(CustomMouseEvent.CLICKED,params); 
      dispatchEvent(eventToBeDispatched); 
      closeMe(event); 
     } 

     protected function remindClick(event:MouseEvent):void 
     {trace("remind"); 
      var params:Object = new Object(); 
      params[Tables.RATE_REMINDER]=Tables.NO; 
      var eventToBeDispatched:Event = new CustomMouseEvent(CustomMouseEvent.CLICKED,params); 
      dispatchEvent(eventToBeDispatched); 
      closeMe(event); 
     } 

     protected function neverClick(event:MouseEvent):void 
     {trace("never"); 
      var params:Object = new Object(); 
      params[Tables.RATE_REMINDER]=Tables.NEVER; 
      var eventToBeDispatched:Event = new CustomMouseEvent(CustomMouseEvent.CLICKED,params); 
      dispatchEvent(eventToBeDispatched); 
      closeMe(event); 
     } 
    ]]> 
</fx:Script> 
. 
. 
<s:Button id="btnOK" label="Ok" width="50" height="30" styleName="stylableButton" click="okClick(event)"/> 
<s:Button id="btnRemind" label="Not now" width="85" height="30" styleName="stylableButton" click="remindClick(event)"/> 
<s:Button id="btnNever" label="Never" width="85" height="30" styleName="stylableButton" click="neverClick(event)"/> 
. 
. 

класса пользовательского события

import flash.events.Event; 
public class CustomMouseEvent extends Event 
{ 
    public static const CLICKED:String = "clicked";  
    private var _parameter:Object;  
    public function CustomMouseEvent(type:String, parameter:Object, bubbles:Boolean = false, cancelable:Boolean = false):void { 
     super(type, bubbles, cancelable); 
     _parameter = parameter; 
    } 

    public function get parameter():Object  { 
     return _parameter; 
    } 

    override public function clone():Event  { 
     return new CustomMouseEvent(type, _parameter, bubbles, cancelable); 
    } 

    override public function toString():String  { 
     return formatToString("CustomMouseEvent", "type", "parameter", "bubbles", "cancelable", "eventPhase"); 
    } 
} 

И в представлении я открыть всплывающее окно и добавить обработчик событий и обработчик

public function popupRateMessage():void 
{ 
    PopUpManager.addPopUp(homeView.rateMessage, homeView.homeContainer as DisplayObjectContainer, false); 
    PopUpManager.centerPopUp(homeView.rateMessage); 
    homeView.rateMessage.y=this.homeView.stage.fullScreenHeight/2-(homeView.rateMessage.height/2); 
    homeView.rateMessage.message = Constants.RATE_REMINDER_PROMPT; 
    trace("AAA"); 
    homeView.rateMessage.btnOK.addEventListener(CustomMouseEvent.CLICKED, ratingPromptHandler); 
    homeView.rateMessage.btnNever.addEventListener(CustomMouseEvent.CLICKED, ratingPromptHandler); 
    homeView.rateMessage.btnRemind.addEventListener(CustomMouseEvent.CLICKED, ratingPromptHandler); 
} 

private function ratingPromptHandler(event:CustomMouseEvent):void { 
    trace(event.parameter); 
    trace(event.parameter[Tables.RATE_REMINDER]); 
} 

Во время отладки я могу увидеть только результаты нижеуказанных трасс при нажатии btnOK. Событие не может достигнуть ratingPromptHandler обработчика.

AAA 
OK 

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

ответ

1

Я думаю, что ваша проблема находится здесь: dispatchEvent (eventToBeDispatched);

Это должно быть отправлено кнопкой, на которую вы нажали. Как вы его используете, он будет отправлен корневым компонентом вашего приложения.

Вы должны использовать что-то вроде: event.target.dispatchEvent (eventToBeDispatched);

Просто примечание. Почему вы посылаете другое событие после нажатия? Просто вызовите другой метод с любыми параметрами, которые вам нужны в нужном классе, например: CLASS.ratingPromptHandler (params);

Надеюсь, что смогу помочь.

+0

Спасибо и да я могу использовать 'CLASS.ratingPromptHandler (PARAMS);' – abi1964

0

Вы добавили в свой файл mxml следующее:

<fx:Metadata> 
      [Event(name="clicked", type="CustomMouseEvent")] 
    </fx:Metadata> 
+0

да я добавил метаданных. – abi1964

Смежные вопросы