2017-06-01 13 views
1

WebアプリケーションでJSF 2.2、PrimeFaces 6、Spring Framework 4.3を使用しています。
ユーザーはログインした後にホームページにリダイレクトされます。ホームページにはいくつかの図や表などが読み込まれています。いくつかのリアルタイム情報が表示され、ホームページの読み込みに時間がかかります。私はユーザーがログインページで待つのが長すぎないようにしたい。JSF/PrimeFacesコンポーネントを同時に読み込み/更新するには?

<h:form id="hiddenForm" style="display: none;"> 
    <p:remoteCommand name="onload" actionListener="#{homeMB.onload}" 
     update=":firstChartForm :secondChartForm :thirdChartForm" global="false"/> 
</h:form> 

そして、これはバッキングBeanのonloadの方法である:だから私はhereに述べたように、ページの読み込み後にチャートをロードするには、次のコードを使用

public void onload() { 
    fillFirstChart(); //Takes 5 seconds 
    fillSecondChart(); //Takes 1 second 
    fillThirdChart(); // Takes 3 seconds. 
} 

チャートは、これらの方法で充填して更新されますp:remoteCommandupdateパラメータの助けが9秒かかります。これらのメソッドを同時に実行し、データがロードされるとすぐに対応するメソッドによって提供されるデータでこれらのチャートをそれぞれ更新したいと思います。

ユーザーがログインボタンをクリックするとすぐにホームページにリダイレクトする必要があります。まず、SecondChartを1秒で入力/更新し、2秒後にThirdChartで入力/更新し、最後に2秒後にFirstChartを埋める/更新する必要があります。だから、合計で約5秒かかるはずです。

編集:私は非同期的にチャートをロードするとき、JSFはそれらすべてを更新するための最も遅い1を待っているので This answerは私のために動作しません。 [OK]を、合計で9秒の代わりに5秒かかるが、私が述べたように "最初にSecondChartは1秒で満たされ/更新され、2秒後にThirdChartが更新/更新され、最後に2秒後にFirstChartは/更新しました"。しかし、最初の回答に記載されている方法を適用すると、すべてが5秒後に更新されます。

This answerが適用されます。私はすぐにユーザーがボタンをクリックし、ログインすると、サーバが収集し、グラフに件のデータをプッシュしhereを示したとして、彼らはRequestContext.getCurrentInstance().update("foo:bar");でBeanをバックアップから更新することができ、意味します。しかし、私はこれまでにもっと簡単な方法があると思っていました。なぜなら、以前にも多くの人が同様の問題に直面している可能性があるからです。

ありがとうございました。

答えて

1

は、ユーザーの要求に...少なくともない非同期Ajax呼び出しを起動せずに、UIをブロックし、その多くの力仕事をしないでください。 async="true"p:remoteCommand上)のリモートコマンドを使用し、何が起こっているかをユーザに知らせて(たとえばp:pollを使用)、何らかのキャッシュ形式を追加します。または、注文を受け、スケジュールされた仕事がバックグラウンドで注文を処理し、完了したときにユーザーに報告する。

も参照してください:

+0

ユーザーがログインし、すべてのグラフが最初に満たされた後、私は 'P使用しています:poll'を後でそれらを検索する。私は[ここ](https://stackoverflow.com/a/6151574/1046569)に示されているようにスケジュールされた仕事で同じことをすることができました。しかし、初めて私は別の何かが必要です。ところで、私はすでに 'p:remoteCommand'を' async = true'と呼んでいますが、リモートコマンドを1つしか使用しないと、5秒後にすべてが更新されます。複数のリモートコマンドを使用する場合は、非同期に呼び出す方法を教えてください。複数のリモートコマンドに同じ 'onload'名を使用することは許されません。 – tylerdurden

+0

タイムアウトのようなものを使用して、リモートコマンドを同時に開始することができます。 https://stackoverflow.com/questions/9516900/how-can-i-create-an-asynchronous-function-in-javascript –

+0

ところで、私はあなたの質問に 'async =" true "'と表示されません。あなたは 'p:remoteCommand'でそれを使うべきです。 –

関連する問題