在我的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。
答案 0 :(得分:0)
用
@ListenerFor(systemEventClass=PostAddToViewEvent.class)
public class ColumnTogglerComponent extends UINamingContainer {
...
将尽早调用processEvent()。