【问题标题】:PrimeFaces restore colomn visibilityPrimeFaces 恢复列可见性
【发布时间】:2016-05-12 08:26:38
【问题描述】:

我有一个 <p:datatable>,其中有一些 p:column,尤其是一个 <p:columns>

我还使用一个<p:columnToggler> 让用户显示或隐藏列。 记住他的选择并不难,动态恢复他的选择是个问题,特别是对于<p:columns>,因为<p:columns> 内部没有get/set 列。我也在使用分页,而 columntoggler+pagination 不是朋友。

恢复用户对<p:dataTable> 切换器的选择的最佳方法是什么?

我使用 PrimeFaces 5.1。

【问题讨论】:

  • 经过长时间的搜索,我找到了(部分)自己的解决方案。你可以找到它:forum.primefaces.org/viewtopic.php?f=3&t=44368&p=138872
  • 如果您认为这是 the 答案,请创建一个真实的答案,但不要忘记包含版本信息(也在您的问题中)。而“仅链接”是没有答案的。阅读您在 PrimeFaces 论坛上的帖子,我认为您使用的是较旧的 PF 版本而不是 5.3,对吗?

标签: jsf primefaces


【解决方案1】:

对不起,我忘了准确:我在 primefaces 5.1

我找到了我的解决方案! 第一次,我把我的 p:columns 放在 p:datatable 里面,它在 p:column 里面,它的工作! columntoggler 更改整个列的可见性。所以我不能隐藏每列... 但是我也使用了分页,并且 columntoggler/pagination 不能很好地协同工作......我可以隐藏一个列,但是如果我在数据表中更改我的页面(使用分页器),该列将重新显示为空!但是如果我刷新整个页面,分页器就会正常工作......

这就是我使用这部分解决方案的原因: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() 返回列号并处理未呈现的列。

希望对某人有所帮助;)

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2023-03-16
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多