嗨,在我的项目中,我需要可视化货币价值,就像我的f:convertNumber
一样我使用固定货币符号;一切都很好,但是当我尝试使用这样的表达式语言来获取符号时:
<h:outputText value="#{rowItem.value}">
<f:convertNumber currencySymbol="#{rowItem.getCurrencySymbol()}" groupingUsed="true" maxFractionDigits="2" type="currency" />
</h:outputText>
就像没有调用getCurrencySymbol方法一样,我确信有些东西我不知道。
答案 0 :(得分:4)
如果#{rowItem}
仅在视图渲染时间内可用,例如由<h:dataTable var="rowItem">
指定,则会发生这种情况,因为变量名称本身已经建议。 <f:convertNumber>
是标记处理程序,而不是UI组件。它在视图构建时执行,而不是在视图渲染时执行。在视图构建期间#{rowItem}
不可用。
这一切都在JSTL in JSF2 Facelets... makes sense?中解释。在该答案中,您可以替换&#34; JSTL&#34;使用<f:convertNumber>
,因为它们都是标记处理程序,因此具有完全相同的生命周期。
在没有创建自定义转换器并更改视图或模型的情况下,标准JSF API中没有解决方案。您可以在此答案中找到可能的解决方案:How to set converter properties for each row of a datatable?
JSF实用程序库OmniFaces提供了<o:converter>
框,以解决此问题。使用方法如下:
<h:outputText value="#{rowItem.value}">
<o:converter converterId="javax.faces.Number" currencySymbol="#{rowItem.getCurrencySymbol()}" type="currency" />
</h:outputText>
(请注意,我省略了其他两个属性,因为这些属性在使用type="currency"
时已经是默认属性)