2017-01-12 2 views
0

IndicatingAjaxButtonのonSubmitを使用してフォームを送信しているときにコンポーネントを更新およびレンダリングしようとしています。しかし、すべてのコンポーネントは1回onSubmitが完了してレンダリングされています。私のフォームがまだ提出している間にそれらをレンダリングする方法はありますか?フォームが送信している間に更新プログレスバーを表示するように。残りのコールが実行されるたびに進捗状況を表示したい。 これは私がやっている何おおよそ次のとおりです。フォームの送信中にwicketコンポーネントをレンダリングする

public class MyPage { 
    Form form; 
    int items; 
    WebMarkupContainer progressbar = new WebMarkupContainer("progressbar"); 
    int progress = 0; 
    MyData dataItems = new MyData(); 

    public MyPage() { 
     progressbar.setOutpuMarkupId(true); 
     items = 5; 
     setupForm(); 
    } 

    public void setupForm() { 
     form = new Form("form", new CompundPropertyModel(dataItems)); 
     form.add(new IndicatingAjaxButton("button") { 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       for (int i = 0; i < items; i++) { 
        progress++; 
        progressbar.add(new AttributeModifier("style", "width: " + progress + "%;")); 
        //rest post call goes here 
       } 
      } 
     }); 
    } 

    add(form); 
    add(progressbar); 

} 


//in html page 
<div wicket:id="progressbar" id="progressbar" style="width: 0% ; background-color:green;"></div> 
+0

私は理解していれば、速く提出する(サーバー側のフロントエンドで受け付けた)数百ミリ秒の最大値と、サーバーのバックエンドの長いアルゴリズムについて考えますか?あなたに役立つコードを与える –

+0

2番目の試みは、大きなファイルのアップロードです。 Wicketにはいくつかのajaxifiedソリューションがあります(公式サイトのガイド) –

答えて

2

このための最良のアプローチは、WicketのネイティブのWebSocketを使用することです。 IWebSocketRequestHandlerを使用すると、長い操作中にWicketコンポーネントを更新したり、生のテキスト(JSON、HTML)を送信できます。必要に応じて何回も押すことができます(例:進捗状況をパーセンテージで示します。

Ajaxコール(フォームの送信)を行う前に、JavaScriptを使用してUIを更新するために、AjaxCallListener#onBeforeSend()コールバックを使用する方法もあります。この方法ではショットは1つしかありません。つまり、ロードインジケーターを表示できますが、現在の進捗状況を表示することはできません。

関連する問題