我有一个<p:datatable>
,其中有一些p:列,特别是一个<p:columns>
。
我还使用一个<p:columnToggler>
让用户显示或隐藏列。
记住他的选择并不困难,这是动态恢复他的选择,这是一个问题,特别是<p:columns>
,因为<p:columns>
内的列没有get / set。我也使用分页和columntoggler +分页不是朋友。
恢复<p:dataTable>
切换器的用户选择的最佳方法是什么?
我使用PrimeFaces 5.1。
答案 0 :(得分:0)
对不起,我忘记了准确:我正在使用素数5.1
我找到了解决办法! 在第一次,我把我的p:列放在一个p:datatable里面,它位于p:列中,它的工作正常! columntoggler改变了整个列的可见性。所以我不能隐藏每列的列... 但我也使用分页和columntoggler /分页不能很好地一起工作......我可以隐藏一个列,但如果我在datatable中更改我的页面(使用paginator),该列将重新显示为空!但是,如果我刷新整个页面,分页器正常工作......
这就是我使用这部分解决方案的原因:Primefaces ColumnToggler does'nt work with pagination
准确地检查/取消选中列可见性的脚本。
<script>
function updateToggles(widget){
$( widget.jqId + ' .ui-chkbox .ui-chkbox-box').each(function() {
var chkbox = $(this);
if(chkbox.hasClass('ui-state-active')) {
widget.check(chkbox);
} else {
widget.uncheck(chkbox);
}
});
}
</script>
<p:dataTable
id="datatable-factures"
value="#{listFactureHandler.table}"
var="facture"
label="Facture"
nativeElements="true"
paginator="true"
rowKey="#{facture.id}"
rowSelectMode="checkbox"
selection="#{listFactureHandler.selection}"
sortBy="#{facture.dateFacture.time}"
sortOrder="descending">
<f:facet name="header">
<p:commandButton id="toggler" type="button" value="Personnaliser" style="float:right;" />
<p:columnToggler widgetVar="columnToggler" id="columnToggler" datasource="datatable-factures" trigger="toggler" ><p:ajax event="toggle" listener="#{dsHandler.onToggleColumn}"/></p:columnToggler>
<p:ajax event="page" oncomplete="updateToggles(PF('columnToggler'))"/>
</f:facet>
<p:ajax event="toggleSelect" update=":formulaire:insert-actions" />
<p:ajax event="rowSelectCheckbox" update=":formulaire:insert-actions" />
<p:ajax event="rowUnselectCheckbox" update=":formulaire:insert-actions" />
<p:column selectionMode="multiple" styleClass="text-center" toggleable="false" />
[...]
<p:column id="columns-champs-perso" headerText="Champs Personnalisés" visible="false">
<p:dataTable id="subfacture" value="#{facture}">
<p:columns headerText="#{champs.libelle}" id="champspersos#{index}" value="#{listFactureHandler.dossier.champsPersonnalises}" columnIndexVar="index" var="champs">
<h:outputText value="#{facture.getChampPersonnalise(champs.code).valeur}" />
</p:columns>
</p:dataTable>
处理程序(dsHandler)记忆数据表状态。 在预渲染时,我做了类似的事情:
Map<String, Boolean> map = objlState.getColumnsVisibles();
for (String id : map.keySet()) {
Column objCol = (Column) FacesContext.getCurrentInstance().getViewRoot().findComponent(id);
if (objCol != null) {
objCol.setVisible(map.getOrDefault(id, true));
}
}
我记住列id而不是索引,因为columntoggler返回columnIndex + visibility并且没有注意未呈现的列。 (但是datatable.getChildCount()返回列号,并处理未呈现的列。
希望每天能帮助某人;)