Jsf 2 具有richfaces 4的动态列
我需要动态的列数。Richfaces在Richfaces 3.3.3-final中提供了Jsf 2 具有richfaces 4的动态列,jsf-2,richfaces,servlet-3.0,Jsf 2,Richfaces,Servlet 3.0,我需要动态的列数。Richfaces在Richfaces 3.3.3-final中提供了,但对于Richfaces 4,他们似乎建议使用 c:forEach 我不能让它正常工作。因为我不能依赖datatable中的var,所以我不知道如何使用正确的列列表来馈送。(每行有自己的值,但标题相同) 基本上,我想显示的数据是一个列表,其中行的大小为x,每行的列值的大小为y。但是如何让告诉支持bean它在哪一行,这样我就可以输入正确的列呢 ui/a4j:重复 我不想重新发明轮子,因为我需要冻结列和许多其他
,但对于Richfaces 4,他们似乎建议使用
c:forEach
我不能让它正常工作。因为我不能依赖datatable中的var,所以我不知道如何使用正确的列列表来馈送
。(每行有自己的值,但标题相同)
基本上,我想显示的数据是一个列表,其中行的大小为x,每行的列值的大小为y。但是如何让
告诉支持bean它在哪一行,这样我就可以输入正确的列呢
ui/a4j:重复
我不想重新发明轮子,因为我需要冻结列和许多其他功能。以这种方式创建html表并将jQuery用于其他功能已被考虑。然而,这将是无望的维持和大量的工作
我还研究了如何从支持bean构建它,动态地创建子对象,但我一点也不喜欢这样。这将是最后的手段
使用:Tomcat7、Servlet3.0、JSF2.1x-Mojarra、RichFaces4.x
更新
好的,我终于得到了一些结果。但是,我的标题不显示。这些值可以完美地显示,但不会显示标题。用迭代或者别的什么方法来做这些工作有问题吗
<rich:dataTable value="#{controller.rows}"
var="row">
<c:forEach items="#{controller.columns}" var="column">
<rd:column id="name" width="250">
<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>
你能得到的
确实是最好的。
无法工作,因为它在视图渲染期间运行,UIData
组件确实需要UIColumn
子级,而不是UIRepeat
子级
为了使
正常工作,您需要为它提供一个所有属性名称的列表/映射(如果是映射,还可能提供标题标签)。下面是一个具体的启动示例,假设Item
具有属性id
、name
和value
,并且{bean.itemPropertyNames}
返回一个正好包含这些属性名称的列表
<rich:dataTable value="#{bean.items}" var="item">
<c:forEach items="#{bean.itemPropertyNames}" var="itemPropertyName">
<rich:column>
#{item[itemPropertyName]}
</rich:column>
</c:forEach>
</rich:dataTable>
#{item[itemPropertyName]}
如果您还需要显示列标题,那么最好是使用映射
,其中键表示属性名称,值表示标题值
<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>
#{itemProperty.value}
#{item[itemProperty.key]}
无论哪种方式,唯一的缺点是
的{bean}
在这个构造中可能不是视图范围的。除非关闭部分状态保存,否则它将在每个请求上重新创建。它需要是请求范围的(或会话或应用程序)。请注意,它不一定需要与
中的bean相同
另见:
你所做的就是使用#{item[itemPropertyName]}这是我找不到的拼图块。基本上,我对使用参数的理解是使用()而不是[]?我将直接测试这个概念,它不代表参数,而是一个动态属性名。另请参见何谓
“大括号符号”一节?
必须是目标组件的直接子级。因此,如果是标记文件/自定义组件,它必须重新连接到
。很抱歉,我试图将表更改为我们自己的表。使用rich:column时没有更改。硬编码的值可以工作,但不能从迭代开始。如果我用header和value切换place,我会得到相反的结果,因此数据就在那里,只是不显示:(显然,
在视图构建时或其他时候对头部进行求值。要确认它,请使用
。如果“有效”,请更改{controller.columns}
to-beMap
,其中K
是属性名,V
是标题值,这样您就可以使用
和
来获取工作id,我使用了c:forEach上定义的id=“input#{theCount.index+1}”varStatus=“theCount”