2014-04-17 3 views
0

В моих мачтах xhtml-view У меня есть таблица данных fontfaces, где я скрываю и показываю столбцы динамически с помощью самодельного столбца Toggler-composite.Как программно изменить визуализированный атрибут столбца p: в p: dataTable

Моей первая РЕАЛИЗАЦИЯ работает отлично и использует явные оказываемые-атрибуты для всех настраиваемых столбцов, которые связаны с ServerSide 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.

ответ

0

С

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

ProcessEvent() будет называться достаточно рано.

Смежные вопросы