了解actionscript 3自定义事件处理程序

时间:2013-12-05 14:56:19

标签: actionscript-3 flex flex4 flex4.5

为了在某些事件中使用传递参数,我使用了自定义事件。我有一个TabbedViewNavigatorApplication手机。我在其中有几点看法。一段时间后,1个视图弹出一个窗口(应用程序评级),其中有3个选项(1.现在率,2。稍后提醒,3。不要提醒)。

我创建了一个自定义事件CustomMouseEvent(有一个不错的网站here for generating custom event),它可以接收一个额外的Object类型参数。我有一个弹出窗口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

请指点我可以解决这个问题的方法。感谢

2 个答案:

答案 0 :(得分:1)

我认为你的问题在这里: dispatchEvent(eventToBeDispatched);

这应该由您点击的按钮发送。您使用它的方式将由应用程序的根组件调度。

你应该使用类似:event.target.dispatchEvent(eventToBeDispatched);

请注意。为什么你点击后再发送另一个事件?只需在所需的类中调用另一个方法,例如:CLASS.ratingPromptHandler(params);

希望我能提供帮助。

答案 1 :(得分:0)

您是否已将以下内容添加到mxml文件中?

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