如何以编程方式更改p:dataTable中p:列的呈现属性

时间:2014-04-17 09:41:07

标签: jsf-2 primefaces

在我的facelets xhtml-view中,我有一个primefaces dataTable,我用自制的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" />

我想摆脱这些渲染属性,因为我已经知道哪些列是可配置的。以下是我在运行时更改dataTable的方法:

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?我该如何触发它?

BTW:我使用PrimeFaces 4.0。

1 个答案:

答案 0 :(得分:0)

@ListenerFor(systemEventClass=PostAddToViewEvent.class) 
public class ColumnTogglerComponent extends UINamingContainer { 
 ...

将尽早调用processEvent()。