2017-06-01 60 views
1

我在我的web應用程序中使用JSF 2.2,PrimeFaces 6和Spring Framework 4.3。
用戶在登錄後重定向到主頁。在主頁上有一些圖表,表格等被加載。他們顯示一些實時信息,並且需要一些時間來加載主頁。我不希望用戶在登錄頁面等待太久。所以我用下面的代碼加載頁面加載後,圖表在here說:如何同時加載/更新JSF/PrimeFaces組件?

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

這是支持豆的onload方法:

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

圖表是由這些方法填充與更新update參數p:remoteCommand的幫助,但需要9秒。我想同時運行這些方法,並在數據加載後立即用相應方法提供的數據更新每個圖表。

我的意思是說,一旦用戶點擊登錄按鈕,用戶應該被重定向到主頁,並且在主頁上首先SecondChart應該在1秒內被填充/更新,並且2秒之後ThirdChart被填充/更新,並且最後2幾秒鐘後FirstChart應該被填充/更新。所以總共需要5秒。

編輯: This answer不適合我,因爲當我異步加載圖表,JSF等待最慢的一個,以更新他們。好吧,總共需要5秒而不是9秒,但正如我在網頁上所說的,首先SecondChart應該在1秒內被填充/更新,2秒鐘之後ThirdChart被填充/更新,最後2秒後FirstChart應該被填充/更新」。但是如果我應用第一個答案中描述的方式,它們全部在5秒內更新。

This answer可能被應用。我的意思是,只要用戶單擊登錄按鈕,服務器就可以收集數據並將其推送到圖表,並且可以從RequestContext.getCurrentInstance().update("foo:bar");更新後臺bean,如here所示。但我認爲可能有一些更簡單的方法,因爲我認爲很多人以前可能遇到過類似的問題。

謝謝。

回答

1

不要在用戶的請求中做太多繁重的工作,阻止用戶界面......至少不是不啓動異步Ajax調用。使用遠程命令async="true"(在p:remoteCommand上),並讓用戶知道發生了什麼(例如使用p:poll)並添加某種形式的緩存。或者,接受訂單,讓計劃的工作在後臺處理訂單並在完成後向用戶報告。

參見:

+0

用戶後登錄,所有的圖表填補了第一次,我用'號碼:poll'稍後檢索它們。我可以按照[此處](https://stackoverflow.com/a/6151574/1046569)中顯示的計劃任務執行相同的操作。但是,我第一次需要不同的東西。順便說一句,我已經用'async = true'調用'p:remoteCommand',但是如果我只使用一個遠程命令,所有這些命令都會在5秒後更新。如果我使用多個遠程命令,你能告訴我如何異步調用它們嗎?不允許爲多個遠程命令使用相同的'onload'名稱。 – tylerdurden

+0

您可以使用類似超時的方式同時啓動遠程命令。請參閱https://stackoverflow.com/questions/9516900/how-can-i-create-an-asynchronous-function-in-javascript –

+0

順便說一下,在您的問題中,我看不到'async =「true」' 。你應該在'p:remoteCommand'中使用它。 –