2017-04-27 7 views
1

Wicket Wizardコンポーネントを使用しています。ウィザードの最後のステップで、ユーザーが完了ボタンをすばやくクリックすると、WicketはonFinish()メソッドを複数回呼び出します。これは私たちのために問題を引き起こす。 興味深いことに、問題は私たちが試したすべてのブラウザ(IE、Chrome)で発生しますが、Firefoxでは発生しません。このブラウザは複数回のクリックを検出し、1回のクリックイベントのみをサーバーに送信します。Wicket 7 - 複数のonClickイベントを生成するウィザード終了ボタン

質問:私たちはこれを防ぐために何ができますか? Wicketフレームワークコードを見ると、ナビボタンがWizardButtonBarに含まれ、FinishButtononClickイベントを処理していることがわかりますが、この動作を上書きまたは制御する正しい方法がわかりません複数のonClickイベント

答えて

0

あなたはAjaxを使用していないようですか?

これを実行した場合、ベールを追加することができます。 #getAjaxIndicatorMarkupId()をオーバーライドすることにより、ダブル・サブミットが防止されます。追加の利点:ウィザードが終了した後にユーザーが戻るボタンを押した場合、ブラウザはウィザードを離れるので、ユーザーはもう一度終了することはできません。

非Ajaxリクエストの場合は、独自のベールJavaScriptをボタンに追加する必要があります。
ユーザーがもう一度ウィザードを終了してもう一度ウィザードを終了できないようにするには、トークンベースのソリューションを使用できます。
ウィザードの開始時に、トークンを取得できます(カウンターだけでもかまいません)。ウィザードが終了したら、トークンを消費したものとしてマークします(たとえば、ドメインオブジェクトに格納します)。
トークンが有効かどうかを確認することができます。そうでない場合は、ウィザードが完了したことを示す別のページにユーザーをリダイレクトします。

+0

ありがとうございました。標準のWicket Wizardコンポーネントを使用するだけです。あなたが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()は何回も呼ばれているということであるが、各時間がfinishPressedがとき0でありますカウントの増分ではなく、というメソッドに入ります。

注:ログに「init:finishPressed = 0」と表示されるのは、です。どのように0にリセットされ続けるか分かりません。しかし、私はonFinish()呼び出しが毎回別のスレッドによって処理されたことに気付きました。しかし、コンストラクタ(finishPressedが0に設定されている唯一の場所)は一度しか呼び出されませんでした。

finishPressedを静的として宣言するだけで(実際のライブ操作では明らかに問題が発生します)、finishPressedのインクリメントが期待通りに行われていることがわかります。

関連する問題