grails在执行时显示flash消息

时间:2013-02-05 16:45:59

标签: flash grails view controller message

在我看来,我有一段关于我的flash消息:

<g:if test="${flash.message}">
    <section id="flashTile">
        <div class="alert fade in">
            <a class="close" data-dismiss="alert" href="#">&times;</a>
        <p>${flash.message}</p>
        </div>
    </section>
</g:if>

在视图的某个时刻,我在控制器中调用一个动作:

<g:form action="doAction">
   <g:submitButton class="ghbtn" name="doAction" />                 
</g:form>

控制器操作类似于:

def doAction() {
    try {
        flash.message = 'Computing...'
        webserviceService.compute()
        flash.message = 'Computed'
        redirect(action: "list")
        return
    } catch (Exception e2) {
        flash.message = 'Could not compute'
        redirect(action: "list")
        return
    }
}

当我点击doAction按钮并成功执行webserviceService.compute()时,我收到了'Computed'消息;当发生错误时,我收到“无法计算”的消息。这很好。

由于webserviceService.compute()需要几秒钟才能执行,我想告知用户系统收到请求并正在处理它,否则用户可能无法正常工作并再次点击该按钮。

我添加了另一条Flash计算消息'Computing ...',点击doAction后会立即显示,直到执行网络服务。

工作流程应如下所示:

点击doAction - &gt;显示'计算......'

webserviceService.compute()已执行 - &gt; '计算......'被'计算'或'无法计算'取代

这里唯一的问题是'计算......'永远不会出现。有关于此的任何提示吗?


感谢提示。我现在把表格改为

<g:form action="calculate" onsubmit="return calculating()">

<script type="text/Javascript">                      
    function calculating() {   
        alert("come here");
        return true;
</script>

而不是警告线我想改变flash.message,但是我没有找到任何有用的东西。 谁能给我一个提示?

1 个答案:

答案 0 :(得分:3)

您对请求/响应周期的工作原理存在根本性的误解。基于此:

flash.message = 'Computing...'
webserviceService.compute()
flash.message = 'Computed'
redirect(action: "list")
return

是什么让你觉得'计算'会回归到视野中?它不会。您将不得不为您的问题应用一些JavaScript。

您可以按照JoshDM声明禁用该按钮,或使用JavaScript显示告知用户等待的消息。这两个都需要在提交按钮的click事件上发生。

这里也有一个Ajax解决方案,但鉴于你目前的理解,我担心这会让你的问题复杂化。