【问题标题】:How to programmatically change rendered attribute of a p:column in p:dataTable如何以编程方式更改 p:dataTable 中 p:column 的渲染属性
【发布时间】: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


    【解决方案1】:

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

    processEvent() 将被尽早调用。

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 2012-10-08
      • 2021-05-06
      • 1970-01-01
      • 2013-11-29
      • 2017-02-27
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多