2013-01-21 12 views
2

實施例:模型視圖更新之前,轉換器是否始終運行?

<h:form> 
    <h:selectOneMenu value="#{bean.timezone}> 
     <f:selectItems value="#{bean.availableTimezones} ... > 
     <f:ajax render="currenttime" /> 
    </h:selectOneMenu> 
</h:form> 

<h:form id="currenttime"> 
    <h:outputText value="#{bean.currentTime}" > 
     <f:convertDateTime dateStyle="short" type="both" timeZone="#{bean.timezone}" /> 
    </h:outputText> 
</h:form> 

<!-- bean.currentTime is of type 'Date' --> 

在該示例中,改變了時區應使文本中currenttime在適當的時區中顯示。但事實並非如此。

我覺得發生這種情況是因爲轉換器是在「應用請求」階段計算的,所選時區的值是在「更新模型」階段更新的。

我對不對? 我不應該使用轉換器嗎?

謝謝!

+0

是您的H? –

+0

是的,與輸出文本不同的形式不同.Tnx的評論,我會更新問題。 – Ben

回答

6

您的具體問題是由於<f:convertDateTime>在視圖生成時間期間初始化,而不是在視圖生成時間期間(exactly like JSTL and so on)造成的。事實上,這在更新模型值階段之前就已經運行了很多,因此在視圖渲染時間內,轉換器不會被用戶提交的時區設置。

這個問題有基本的回答如下回答同樣的理由:

的方式之一,是管理和裝訂器實例作爲bean屬性。

private DateTimeConverter converter; 

@PostConstruct 
public void init() { 
    converter = new DateTimeConverter(); 
    converter.setDateStyle("short"); 
    converter.setType("both"); 
} 

public DateTimeConverter getDateTimeConverter() { 
    converter.setTimeZone(timezone); 
    return converter; 
} 

隨着

<h:outputText value="#{bean.currentTime}" > 
    <f:converter binding="#{bean.dateTimeConverter}" /> 
</h:outputText> 

的方法是使用OmniFaces <o:converter支持轉換器的性能的渲染評價:同樣的形式selectOneMenu用於:

<h:outputText value="#{bean.currentTime}" > 
    <o:converter converterId="javax.faces.DateTime" dateStyle="short" type="both" timeZone="#{bean.timezone}" /> 
</h:outputText> 
+1

omnifaces <3 沒什麼我更喜歡它,當它從它可用。這是一個明顯的選擇 –

+0

不客氣:) – BalusC

+0

我使用Omnifaces並喜歡它,所以這裏的選擇是明確的:-) – Ben

相關問題