GWT:如何阻止处理程序在用户在确认框中选择一个选项之前接收事件?

问题描述

| 这将需要一些解释。 在我们的项目中,我们有一个弹出窗口,其中有很多字段可以编辑,底部还有“保存”和“取消”按钮。显然,单击“保存”将保存您所做的任何更改,或者如果没有更改,则仅关闭弹出窗口。如果没有更改,“取消”也会关闭弹出窗口。如果在进行更改时取消操作,则会弹出一个确认对话框,询问您是否确定要放弃所做的更改。 这样的想法是,如果您单击“否”,确认对话框将关闭,但不会弹出窗口,因为用户已表明他们不想放弃这些更改。 现在的问题是,即使您进行了更改,单击“取消”按钮时,弹出窗口也会立即关闭。确认对话框也会弹出,但是由于弹出窗口已经消失,因此没有太大用处。 发生这种情况的原因是,用于关闭弹出窗口和显示确认对话框的处理程序都作为单击处理程序附加到了“取消”按钮上。在GWT切换到处理程序之前,此方法就可以工作了,因为我们将侦听器列表作为参数传递给了显示确认对话框的方法。然后,如果用户确定可以放弃更改,则仅触发那些侦听器。由于事件模型更改(它们保存在GWT窗口小部件代码中),我无法控制处理程序,因此我无法再这样做了。 我解决此问题的想法是简单地添加将弹出窗口关闭的处理程序,该处理程序仅在确认对话框中选择了正确选项时才会触发。我问这个问题的唯一原因是看看是否还有其他方法可以执行此操作,因为添加弹出式关闭处理程序的整个过程都是在我们的xml布局中处理的,并且需要进行一些有趣的体系结构更改才能做到这一点好好工作。 :将触发BeforePopupClosedEvent,这将打开确认对话框。如果用户指示不应该放弃更改,那么将取消BeforePopupClosedEvent。不幸的是,代码在等待用户响应的同时一直执行,关闭弹出窗口的处理程序继续执行该操作,因为用户尚未选择任何选项。     

解决方法

这是我为解决此问题而制作的小部件的早期草稿。后来我做了一个更通用的包装子类ѭ0,它将包装任何小部件的单击处理程序。 它通过在调用addClickHandler时切换备用HandlerManager来工作,并且仅在确认对话框返回时才触发该HandlerManager的事件。
public class ConfirmButton extends Button
{
    private HandlerManager handlerManager = new HandlerManager(this);
    private String message = \"Do you really want to do this?\";
    private ClickHandler myRealClickHandler = new ClickHandler() {

        @Override
        public void onClick(ClickEvent event)
        {
            if (Window.confirm(message)) handlerManager.fireEvent(event);
        }
    };

    public ConfirmButton()
    {
        super();
        addDomHandler(myRealClickHandler,ClickEvent.getType());
    }

    public ConfirmButton(String text)
    {
        this();
        setText(text);
    }

    public void setConfirmationPrompt(String prompt)
    {
        message = prompt;
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler)
    {
        HandlerRegistration ret = handlerManager.addHandler(ClickEvent.getType(),handler);
        return ret;
    }
}