【发布时间】: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