2017-04-27 42 views
1

我們使用Wicket Wizard組件。在嚮導的最後一步,我們發現如果用戶快速點擊完成按鈕,Wicket會多次調用我們的onFinish()方法。這給我們帶來了問題。 有趣的是,這個問題出現在我們嘗試過的所有瀏覽器(IE,Chrome)中,但Firefox中沒有。該瀏覽器似乎檢測到多次點擊,並且只向服務器發送一次單擊事件。Wicket 7 - 嚮導完成按鈕生成多個onClick事件

問題是,我們可以做些什麼來防止這種情況發生? 從查看Wicket框架代碼,我可以看到導航按鈕包含在WizardButtonBar中,而FinishButton正在處理onClick事件,但我不確定覆蓋或控制此行爲並以某種方式檢測的正確方法多個onClick事件

回答

0

您似乎沒有使用Ajax,是嗎?

如果你這樣做,你可以添加一個面紗 - 例如,通過覆蓋#getAjaxIndicatorMarkupId() - 任何雙重提交將被阻止。附加好處:如果用戶在嚮導完成後按下後退按鈕,瀏覽器將離開向導,用戶無法再次完成。

對於非Ajax請求,您必須將自己的面紗JavaScript添加到您的按鈕。
爲了防止用戶第二次返回並完成嚮導,可以使用基於令牌的解決方案:
在嚮導的開始處獲得一個令牌(可能只是一個計數器)。嚮導完成後,將該標記標記爲已耗盡(例如,將其存儲在您的域對象中)。
在對嚮導的每個請求中,都可以檢查令牌是否仍然有效 - 如果不是,請將用戶重定向到另一個頁面,以說明該向導已完成。

+0

謝謝Sven。只需使用標準的Wicket嚮導組件。如果你們可以提供一個啓用了Ajax的嚮導,那將非常棒;) –

+0

它已經在那裏:覆蓋newButtonBar()並讓它返回一個'AjaxWizardButtonBar'。 – svenmeier

0

安德魯非常友好地爲我提交了原始問題。我曾嘗試這樣做(幾乎如你所說):

class MyWizard extends Wizard { 

    private Integer finishPressed = -1; // deliberately set an invalid value to start with 

    public MyWizard() { 
     finishPressed = 0; // only place where finishedPressed is set to 0 
     log.info("init: finishPressed={}", finishPressed); 
    } 

    @Override 
    public void onFinish() { 
     log.info("begin: finishPressed={}", finishPressed); 
     if (! finishPressed) { 
      finishPressed += 1; 
      // do onFinish actions ... 
     } 
     log.info("end: finishPressed={}", finishPressed); 
    } 
} 

不過,我發現的是,onFinish()被調用多次,我按下Finish按鈕,但每次finishPressed爲0時它進入方法,而不是計數遞增。

注意:我只有在日誌中看到「init:finishPressed = 0」一次。我不知道它是如何持續重置爲0.但是,我注意到onFinish()調用每次都由不同的線程處理。但如前所述,構造函數(唯一的地方finishPressed設置爲0)只被調用一次。

只有將finishPressed聲明爲static(這顯然會導致實際操作中的問題),我是否可以看到finishPressed按預期增加。