我有几个事件侦听器配置为侦听控件上的click事件。
我不知道这是否是一个正确的假设,但我相信我有一个配置为“先”听。在第一个侦听器捕获事件之后,它会将控制权传递给其余的侦听器(如果需要)。
这基本上告诉用户“你正试图在某处导航,但是你有未保存的更改,你想要1)保存并继续2)丢弃更改并继续3)返回并且不继续。
以下是设置监听器的示例代码
clickComponent.addEventListener(MouseEvent.CLICK, parentComponent.saveChanges);
clickComponent.addEventListener(MouseEvent.CLICK, continueOn);
这是我在parentComponent
中捕获事件的地方private var unsavedEvent:Event = null;
public function saveChanges(e:Event):void {
if (unsavedEvent == null) {
unsavedEvent = e;
e.stopImmediatePropagation();
Alert.buttonWidth = 150;
Alert.noLabel = "Discard Changes";
Alert.yesLabel = "Save Changes";
Alert.cancelLabel = "Return";
var alert:Alert = Alert.show(
"You have unsaved changes! What would you like to do? ",
"Save?",
Alert.NO | Alert.YES | Alert.CANCEL,
this,
handleUnsavedResponse,
null,
Alert.YES);
}
}
private function handleUnsavedResponse(evt:CloseEvent):void {
var takeAdditionalAction:Boolean = false;
if(evt.detail == Alert.YES) {
save();
takeAdditionalAction = true;
} else if(evt.detail == Alert.NO) {
discard();
takeAdditionalAction = true;
}
if (takeAdditionalAction) {
dispatchEvent(unsavedEvent.clone()); // rethrow the event we caught. not WORKING
}
unsavedEvent = null; //reset the saved event
}
对dispatchEvent(unsavedEvent.clone());
的调用似乎不起作用(或至少continueOn
未捕获该事件)首先,我尝试在没有clone()
调用的情况下重新调度事件,但这也不起作用。
我可以这样做吗?还有更好的方法吗?
答案 0 :(得分:1)
知道了!我需要unsavedEvent.target.dispatchEvent(unsavedEvent.clone());
而不是dispatchEvent(unsavedEvent.clone());
我认为重新抛出事件也会改变目标(即从clickComponent到parentComponent),这可以解释为什么我的其他侦听器没有响应原始代码中的事件。