【问题标题】:Click Event handler单击事件处理程序
【发布时间】:2015-12-22 01:07:06
【问题描述】:

当我单击按钮时,单击事件处理程序会执行代码。如果错误地(如果浏览器挂起)我单击按钮两次,代码将被执行两次。我不希望这种情况发生。 有什么建议可以阻止它吗?

我想我应该使用时间表或计时器,但我不确定

下面是代码:

public void onSendButtonClicked() {

        disableButtons();

        eventBus.fireEvent(new SendEmcsDeclarationEvent(getDeclaration(), getMsgType()));
    }

【问题讨论】:

  • @addullah 我的应用程序中没有任何启用功能,也许我需要比这更好的解决方案

标签: gwt event-handling


【解决方案1】:

您可以 - 正如 Abdullah 提到的 - 使用

禁用/启用 GWT 中的每个小部件

widget.setEnable(false)

widget.setEnable(true).

如果你想锁定整个屏幕,创建一个模式弹出窗口,在按下按钮后显示它并在代码完成后隐藏它。

public void onSendButtonClicked() {

    myProgessBar.show();

    eventBus.fireEvent(new SendEmcsDeclarationEvent(getDeclaration(), getMsgType()));

    myProgressBar.hide();
}

如果您使用异步调用,则必须在回调中隐藏进度条。在这种情况下,finally 命令可能会在回调执行之前执行。在您的情况下,创建 ShowProgressBarEvent 和 HideProgressbarEvent 可能是个好主意,这样您就可以在整个应用程序中使用进度条。

如果您正在使用小部件库 f.e.:GXT,您会发现一个可供使用的 ProgressBar。

希望对您有所帮助。

【讨论】:

  • @EL Hoss disableButtons() 函数已经在禁用按钮。SendEmcsDeclarationEvent 函数基本上在某处发送声明,但在事件被 eventBus 完成之前,另一个事件开始,导致 2 个声明被发送相同数据。这是我们需要解决的问题
  • 您在何处/何时启用该按钮?
  • 如我上面的示例代码所示,当单击发送按钮时,会调用 onSendButtonClicked() 函数,并在其中调用 disableButtons(),这会禁用发送按钮和许多其他按钮,最后是已发送声明。
  • 我虽然你禁用了按钮。怎么才能再次点击按钮?
  • 如果应用程序挂起或网速慢,它会在被禁用之前被点击
【解决方案2】:

我能想到的最好方法是启用/禁用按钮本身,以确保在上一次调用完成之前不会再次调用处理程序中的代码。

public void onSendButtonClicked()
{
    try
    {
        disableButtons();

        eventBus.fireEvent(new SendEmcsDeclarationEvent(getDeclaration(), getMsgType()));
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally 
    {
        enableButtons();
    }

}

【讨论】:

    【解决方案3】:

    当我创建一个按钮时,我总是会添加一个动画 gif (ajaxloader)。

    单击按钮时,我使按钮不可见,而 ajaxloader 可见。 操作完成后,我使 ajaxloader 不可见,而按钮可见。

    通过这种方式,用户可以获得一些视觉反馈,表明某些事情正在发生(禁用按钮时您没有得到什么),而不是整个应用程序被阻塞(就像模态一样),这是使用 ajax 的优点之一.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2022-01-24
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多