带有richfaces 4的动态列
Posted
技术标签:
【中文标题】带有richfaces 4的动态列【英文标题】:Dynamic columns with richfaces 4 【发布时间】:2012-11-29 21:48:43 【问题描述】:我需要动态列数。 Richfaces 在richfaces 3.3.3-final 中为其提供<rich:columns>
,但对于Richfaces 4,他们似乎推荐<c:forEach>
。
c:forEach
我无法让它正常工作。由于我不能依赖数据表中的 var,我无法弄清楚如何为 <c:forEach>
提供正确的列列表。 (每一行都有自己的值,但标题相同)
基本上我要显示的数据是一个 x 大小的行列表,每一行都有一个 y 大小的列值列表。但是如何让<c:forEach>
告诉支持 bean 它在哪一行,以便我可以提供正确的列?
ui/a4j:重复
我不想重新发明***,因为我需要冻结列和许多其他功能。已经考虑过以这种方式创建表格 html 并使用 jQuery 来实现其他功能。然而,这将是毫无希望的维护和大量的工作。
我还研究了从支持 bean 动态创建子级来构建它,但我一点也不喜欢那样。这必须是最后的手段。
使用:Tomcat 7、servlet 3.0、JSF 2.1x - Mojarra、Richfaces 4.x
更新
好的,我终于得到了一些结果。但是我的标题没有显示。这些值显示完美,但不显示标题。用迭代或其他东西做它们有什么问题吗?
<rich:dataTable value="#controller.rows"
var="row">
<c:forEach items="#controller.columns" var="column">
<rd:column id="name" >
<f:facet name="header">
<h:outputText value="#row.myArrayList[column].header" />
</f:facet>
<h:inputText value="#row.myArrayList[column].value" disabled="#row.myArrayList[column].open"/>
</rd:column>
</c:forEach>
</rich:dataTable>
【问题讨论】:
为了让 id 工作,我使用了 c:forEach 上定义的 id="input#theCount.index+1" varStatus="theCount" 【参考方案1】:<c:forEach>
确实是你能得到的最好的。 <ui/a4j:repeat>
不会在视图渲染期间运行,而 UIData
组件确实需要 UIColumn
子级,而不是 UIRepeat
子级。
为了让<c:forEach>
工作,您需要向它提供所有属性名称的列表/映射(如果是映射,可能还有标题标签)。这是一个具体的启动示例,假设Item
具有属性id
、name
和value
,并且#bean.itemPropertyNames
返回具有这些属性名称的List<String>
。
<rich:dataTable value="#bean.items" var="item">
<c:forEach items="#bean.itemPropertyNames" var="itemPropertyName">
<rich:column>
#item[itemPropertyName]
</rich:column>
</c:forEach>
</rich:dataTable>
如果您还需要显示列标题,那么最好有一个Map<String, String>
,其中键代表属性名称,值代表标题值。
<rich:dataTable value="#bean.items" var="item">
<c:forEach items="#bean.itemProperties" var="itemProperty">
<rich:column>
<f:facet name="header">#itemProperty.value</f:facet>
#item[itemProperty.key]
</rich:column>
</c:forEach>
</rich:dataTable>
无论哪种方式,唯一的缺点是<c:forEach items>
的#bean
在此构造中不能是视图范围的。除非您关闭部分状态保存,否则它将在每次请求时重新创建。它需要是一个请求范围的请求(或会话或应用程序)。请注意,它不一定需要与 <rich:dataTable value>
中的 bean 相同。
另见:
Dynamically generate h:column based on list of hashmaps【讨论】:
您所做的是使用#item[itemPropertyName] 那是我永远找不到的缺失拼图。基本上我对使用参数的理解是你使用()而不是[]?我将立即测试这个概念 不代表参数,而是动态属性名。另请参阅***.com/tags/el/info 的“大括号表示法”部分 什么是<rd:column>
? <f:facet>
必须是目标组件的直接子级。因此,如果是标记文件/自定义组件,则必须将其重新附加到 <rich:column>
。
对不起,我试图将表更改为我们自己的。使用rich:column 时没有变化。硬编码值有效,但不适用于迭代。如果我用标题和值切换位置,我会得到相反的结果,所以数据在那里,只是没有显示:(
显然<rich:column>
在视图构建时间或其他时间评估标题。要确认它,请使用<h:outputText value="#column" />
。如果“有效”,请将#controller.columns
更改为Map<K,V>
,其中K
是属性名称,V
是标头值,以便您可以使用<h:outputText value="#column.value" />
和<h:inputText value="#row.myArrayList[column.key].value" />
以上是关于带有richfaces 4的动态列的主要内容,如果未能解决你的问题,请参考以下文章
带有 Mojarra 2.1.28 和 RichFaces 4.3 的 Internet Explorer Ajax 错误
集群环境中的故障转移不适用于 JSF 2、Richfaces 4、Tomcat 7