2015-06-20 52 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