【问题标题】:Understanding actionscript 3 custom event handler了解 actionscript 3 自定义事件处理程序
【发布时间】:2013-12-05 14:56:19
【问题描述】:

为了在某些事件中使用传递参数,我使用了自定义事件。我有一个用于手机的TabbedViewNavigatorApplication。我有几个观点。一段时间后,1个浏览量弹出一个窗口(App评分),有3个选项(1.现在评分,2.稍后提醒,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

请帮助我指出可以解决此问题的方法。谢谢

【问题讨论】:

    标签: actionscript-3 apache-flex flex4 flex4.5


    【解决方案1】:

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

    这应该由您单击的按钮发送。您使用它的方式,它将由您的应用程序的根组件分派。

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

    只是一个注释。为什么单击后要调度另一个事件?只需在所需的类中使用您需要的任何参数调用另一个方法,例如:CLASS.ratingPromptHandler(params);

    希望我能帮上忙。

    【讨论】:

    • 谢谢,是的,我可以使用CLASS.ratingPromptHandler(params);
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多