2011-05-25 43 views
0

这需要一些解释。GWT:如何防止处理程序接收事件,直到用户在确认框中选择一个选项?

在我们的项目中,我们有一个弹出窗口,其中有很多可以在其中编辑的字段以及底部的保存和取消按钮。点击保存显然会保存您所做的任何更改,或者在没有更改时关闭弹出窗口。如果没有更改,取消也会关闭弹出窗口。如果您在有更改时取消,会弹出一个确认对话框,询问您是否确定要放弃所做的更改。

想法是,如果您单击否,确认对话框将关闭,但弹出窗口不会,因为用户已表示他们不想放弃这些更改。

现在的问题是,当您单击“取消”按钮时,即使发生了更改,弹出框也会立即关闭。确认对话框也会弹出,但弹出窗口已经不存在了,所以没什么用。

发生这种情况的原因是关闭弹出窗口并显示确认对话框的处理程序都作为单击处理程序附加到“取消”按钮。在GWT切换到处理程序之前,这用于工作,因为我们将侦听器列表作为参数传递给显示确认对话框的方法。如果用户认为可以放弃更改,我们只会触发这些监听器。由于事件模型更改后我无法控制处理程序(它们保存在GWT Widget代码中),所以我不能再这样做了。

解决这个问题的想法是简单地将关闭弹出窗口的处理程序添加到只有在确认对话框中选择正确选项时才会触发的不同事件。我问这个问题的唯一原因是看看是否有其他的方式来做到这一点,因为这个弹出的关闭处理程序被添加的东西是在我们的xml布局中处理的,并且它需要一些有趣的架构更改才能使其工作正常。

:BeforePopupClosedEvent被触发,打开确认对话框。如果用户指示不应丢弃更改,则会取消BeforePopupClosedEvent。不幸的是,代码会在等待用户响应时继续执行,并且关闭弹出窗口的处理程序继续执行,因为用户尚未选择选项。

回答

0

这是我为解决此问题而做的一个小部件的早期草稿。后来我做了一个更通用的包装子类SimplePanel,它将包装任何小部件的点击处理程序。

当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; 
    } 
} 
相关问题