2013-02-05 67 views
1

我認爲我有我的閃光消息的部分:的grails鑑於顯示閃光消息而執行

<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之後立即顯示,直到webservice被執行。

的工作流程應該是這個樣子:

點擊doAction - >節目 '計算...'

webserviceService.compute()執行 - > '計算...' 被 '計算' 或「能取代不計算'

這裏唯一的問題是'計算...'從來沒有出現。任何提示?


感謝您的提示。現在我已經改變了我的形式

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

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

代替警戒線我想改變flash.message,但SOFAR我還沒有發現任何關於這個有用。 任何人都可以給我一個提示嗎?

+0

您是否考慮在第一次單擊後禁用按鈕以防止雙擊? – JoshDM

+0

這將是一個很好的解決方法,但我仍然想按照上述方式解決它 – user2041083

+0

看起來Ajax請求會爲您做竅門,但接下來沒有可用的flash消息... – herom

回答

3

您對請求/響應週期的工作原理有一個基本的誤解。基於此:

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

是什麼讓你覺得'計算'會回到視圖?它不會。你將不得不爲你的問題應用一些JavaScript。

您可以禁用按鈕,因爲JoshDM聲明或使用JavaScript來顯示消息,告訴用戶等待。這兩個都需要在提交按鈕的點擊事件上發生。

這裏還有一個Ajax解決方案,但考慮到您當前的理解,恐怕這會讓您在這個時候更加複雜。

+0

我會也建議使用Ajax,我同意這會讓線程所有者變得複雜,但另一方面:學習Ajax比現在更好? :) – herom