如何以编程方式更改 p:dataTable 中 p:column 的渲染属性
Posted
技术标签:
【中文标题】如何以编程方式更改 p:dataTable 中 p:column 的渲染属性【英文标题】:How to programmatically change rendered attribute of a p:column in p:dataTable 【发布时间】:2014-06-01 12:27:49 【问题描述】:在我的 facelets xhtml-view 中,我有一个 primefaces 数据表,我使用自制的 columnToggler-composite 动态隐藏和显示列。
我的第一个实现工作正常,并为绑定到服务器端 columModel 的所有可配置列使用显式渲染属性...
<p:dataTable id="myDataTable" ...>
<p:column rendered="#bean.myColumnModel.isVisible('A Column name')" >
...
</p:column>
<!-- many other columns -->
</p:dataTable>
<my:columnToggler columnModel="#bean.myColumnModel" for="myDataTable" />
我想摆脱这些渲染属性,因为我已经知道哪些列是可配置的。以下是我在运行时更改数据表的方法:
private void renderColumnsInDataTable()
List columns = dataTable.getColumns();
for (Iterator<Column> iterator = columns.iterator(); iterator.hasNext();)
...
if (isColumnConfigurable(columnName))
column.setRendered(isVisible(columnName));
除了我在第一次调用时遇到问题之外,这可行。该方法必须在 dataTable 填充其列之后和 dataTable 首次呈现之前第一次调用。
我最初的想法是引入一个@FacesComponent,将我的columnToggler 绑定到这个@FacesComponent 并监听某些JSF 事件,但是例如使用这个实现,列只会在第二次调用时更新:
@FacesComponent(...)
public class ColumnTogglerComponent extends UINamingContainer
@Override
public void processEvent(ComponentSystemEvent event) throws AbortProcessingException
// will be triggered for a javax.faces.event.PostRestoreStateEvent
// to late !
我可以在哪里调用 renderColumnsInDataTable?如何触发?
顺便说一句:我使用 PrimeFaces 4.0。
【问题讨论】:
【参考方案1】:与
@ListenerFor(systemEventClass=PostAddToViewEvent.class)
public class ColumnTogglerComponent extends UINamingContainer
...
processEvent() 将被尽早调用。
【讨论】:
以上是关于如何以编程方式更改 p:dataTable 中 p:column 的渲染属性的主要内容,如果未能解决你的问题,请参考以下文章
如何更改默认 p:dataTable emptyMessage 消息
如何在 p:dataTable 中使用 p:graphicImage 和 StreamedContent? [复制]