拒绝已停止的Flex事件

时间:2011-10-11 12:30:43

标签: flex events

我有几个事件侦听器配置为侦听控件上的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()调用的情况下重新调度事件,但这也不起作用。

我可以这样做吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

知道了!我需要unsavedEvent.target.dispatchEvent(unsavedEvent.clone());而不是dispatchEvent(unsavedEvent.clone());

我认为重新抛出事件也会改变目标(即从clickComponent到parentComponent),这可以解释为什么我的其他侦听器没有响应原始代码中的事件。