對於我的一個JSF/primefaces項目,我想顯示自給定日期以來的經過時間 - 認爲「這個條目最後編輯了3h 5m前」。如何在Javascript中使用JSF複合組件中的屬性值?
首先,我計算了後臺bean中的時間間隔,並讓視圖輪詢它。這意味着每秒一次ajax呼叫,並且也很容易中斷 - 不好。
所以我爲這個任務做了第一個簡單的JSF複合組件。基本上它只是h:outputText的一個包裝:它將開始日期作爲屬性,然後在Javascript中它每秒鐘計算到當前日期的時間間隔並相應地更新outputText。
下面的代碼:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="start" />
</composite:interface>
<composite:implementation>
<div id="#{cc.clientId}" class="elapsedTime">
<h:outputText id="outTxt" value="#{cc.attrs.start}" />
</div>
<script type="text/javascript">
var outTxt = document.getElementById("#{cc.clientId}:outTxt");
var a = outTxt.innerHTML.split(/[^0-9]/);
var baseDate = new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
function timeStringFromSeconds(s)
{
var hours = Math.floor((s/86400) * 24);
var minutes = Math.floor(((s/3600) % 1) * 60);
var seconds = Math.round(((s/60) % 1) * 60);
if (minutes < 1) {
minutes = "00";
} else if (minutes < 10) {
minutes = "0" + minutes;
}
if (seconds < 1) {
seconds = "00";
} else if (seconds < 10) {
seconds = "0" + minutes;
}
return(hours + ":" + minutes + ":" + seconds);
}
function update() {
var currentDate = new Date();
var elapsed = (currentDate - baseDate)/1000;
outTxt.innerHTML = timeStringFromSeconds(elapsed);
}
update();
setInterval(update, 1000);
</script>
</composite:implementation>
</html>
這是按預期工作。但是,由於我無法直接從JS檢索start屬性值,因此我讓h:outputText首先顯示日期值,然後JS將從呈現的HTML中檢索它,並用經過的時間替換它。
因此,儘管我立即更新了值,但在某些瀏覽器/設備上,原始日期值只是短暫可見的。整件事對我來說就像是一個醜陋的解決方法。如果由於某種原因,我想使用第二個屬性,我根本無法使用它,所以這種方法明顯受到限制/破壞。
所以我的問題是:是否有更乾淨的方式來做到這一點,例如通過直接訪問屬性(如果可能)?
或者這只是你在複合材料中無法做到的事情?
非常感謝!
首先,這不是'複合'相關的。其次,你是什麼意思_「但是,因爲我無法直接從JS中檢索起始屬性值,」_你的解決方案沒有錯,通常是這樣做的。試着找出'延遲'來自何處。你知道這個:http://timeago.yarp.com/(不需要自己構建它) – Kukeltje
@Kukeltje:謝謝!我的問題是,應該計算傳遞時間的值是通過屬性引入組件的。因爲我無法直接讀取它的值,所以我將outputText組件綁定到屬性,然後從HTML中選取值。在此期間,我發現你可以在Javascript中使用EL - 這是我想要的直接訪問,請參閱我的答案。感謝提到timeago,我會看看它!最好的問候,Toastor – Toastor