【发布时间】:2018-12-24 23:15:25
【问题描述】:
我创建了一个非常通用的 jsf 复合组件,它从通用行数据呈现一个 primefaces 数据表。
对于应该呈现的每一行,我都有一个名为 ColumnDescription 的 pojo,其中包含标题名称和行数据索引以获取数据。
这很好用,但现在我请求允许在列上设置可选转换器。
所以我用一个converterId 扩展了ColumnDescription。 问题是我只需要将转换器附加到 ColumnDescription 中的 converterId 不为空。
第一个想法:
<h:outputText value="#{row[column.rowBeanProperty]}">
<c:if test="#{column.hasConverter}">
<f:converter converterId="#{column.converterId}" />
</c:if>
这不起作用。 if 标记中的测试甚至不会被评估。 我认为这是因为 jsp 标签将被评估的不同阶段。
第二个想法 为条件使用渲染属性
<h:outputText value="#{row[column.rowBeanProperty]}">
<ui:fragment rendered="#{column.hasConverter}">
<f:converter converterId="#{column.converterId}" />
</ui:fragment>
这不起作用,因为转换器需要附加到可编辑的值组件
TagException: /components/dataReport.xhtml @38,80 <f:converter> Parent not an instance of ValueHolder: com.sun.faces.facelets.tag.ui.ComponentRef@35b683c2
有条件加转换器吗?
提前致谢 塞巴斯蒂安
【问题讨论】:
-
正如例外所说,JSF 转换器用于将 Java 值转换为 HTML 值,反之亦然。它们总是用于输入组件(选择列表、选择菜单......)。将其附加到列的目的是什么?也许您正在寻找类似值格式化程序的东西?
-
你试过
<f:converter converterId="#{column.converterId}" rendered="#{column.hasConverter}"/>吗? -
@JasperdeVries 是的,这是我的第一个想法,但转换器没有渲染属性
-
尝试在
h:outputText中添加<f:attribute name="converter" value="#{column.converterId}" rendered="{column.hasConverter}" />? -
@Kukeltje 没用。属性标签中没有呈现属性。但即使没有这个属性