【发布时间】: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。
【问题讨论】:
标签: jsf-2 primefaces