2015-06-20 56 views
3

在戴爾的一次採訪中,我被問到了這個問題。ajax如何以1秒的間隔更新組件?

new Date()爲您提供了當前的日期/時間初始化的Date對象。

讓想我的屏幕右上角顯示當前時間,和人做過這樣的。

<h:outputText value="#{bean.presentDateTime}" /> 

這將如何修改以始終顯示當前日期和時間?

+0

將工作時鐘(工作在第二毫秒或更低範圍)同步到服務器肯定會導致服務器死機。它們在Web應用程序中不可取。 – Tiny

+0

這肯定是個詭計問題。沒有JS,這是不可能的。請注意,ajax實際上使用JS。或者,對於「沒有JavaScript」的部分,實際上可能存在誤解/錯誤解釋的手段。 – BalusC

+0

@BalusC:哦,是的!你做對了。沒有Javascript,我的意思是我需要使用部分頁面渲染,而不是純javascript。我編輯了標題。 –

回答

2

基本上,你想打服務器,並在更新的時間間隔的結果。這被稱爲「輪詢」。標準的JSF沒有內置的工具,所以你仍然需要自己編寫一些JS代碼(或者理論上,抓住一個JSF組件,它可以透明地爲你呈現所需的JS代碼)。在JavaScript中,您可以使用setInterval()來間隔執行一個函數。

所以,一旦你給時間戳組件固定ID,

<h:outputText id="presentDateTime" value="#{bean.presentDateTime}" /> 

和您提供的以下隱藏的形式,其命令按鈕Ajax的更新它,

<h:form id="hiddenForm" style="display:none"> 
    <h:commandButton id="updatePresentDateTime"> 
     <f:ajax render=":presentDateTime" /> 
    </h:commandButton> 
</h:form> 

那麼你就可以得到它在DOM/window/body準備好的時候執行下面的腳本。

<script> 
    setInterval(function() { 
     document.getElementById("hiddenForm:updatePresentDateTime").click(); 
    }, 1000); 
</script> 

不要在生產中用於這個目的(客戶端時鐘)。作爲對面試問題的回答(或者作爲some showcase page中的一個例子),這至多是可以的。在生產中,如果需要,結合以合理較長間隔運行的民意調查,可以更好地攫取「純粹」JS,例如, 1分鐘。或者如果您的環境支持它,請使用WS或SSE推送。

+0

我幾乎每天都記得我承諾的東西。不幸的是,該項目目前缺貨。請不要有絲毫的懷疑。我一定會。並感謝你的答案。 –

+0

所有在適當的時間。 – BalusC