【问题标题】:How to keep filter and current page when updating PrimeFaces dataTable更新 PrimeFaces 数据表时如何保留过滤器和当前页面
【发布时间】:2016-09-10 07:36:49
【问题描述】:

我有一个包含分页器和过滤器的数据表。当表格被过滤而不是在第一页并且我尝试删除一行时,我想保留过滤器和当前页面。所以我尝试了这样的事情:

  try {
            List<Vector> filteredData = incomeTable.getFilteredValue();
            Map<String, Object> filterValue = incomeTable.getFilters();
            if (filteredData == null) {
                filteredData = lstData;
            }

            int index = filteredData.indexOf(selectedRow);
            lstData.remove(selectedRow);
            filteredData.remove(selectedRow);
            if (filteredData.size() > index) {
                selectedRow = filteredData.get(index);
            } else {
                selectedRow = filteredData.get(index - 1);
            }
            onRowSelect();
            incomeTable.setFilteredValue(filteredData);
            incomeTable.setFilters(filterValue);
            incomeTable.setFirst(getFirstRecordShow(filteredData));
        } catch (Exception e) {
            reportException(e);
        }

这个函数处理完后,我在客户端更新表:

update="@([id$=incomeTable])"

我能够保留当前页面、过滤数据列表并正确显示所选行。但是我在标题行上使用的过滤器被清除了。我已经试过了

incomeTable.setFilters(filterValue); 

再次设置该值,但仍然无法正常工作。

有谁知道在这种情况下如何同时保留过滤器和当前页面?

我的 PrimeFaces 版本是 5.3。

【问题讨论】:

  • @Jasper de Vries:在这种情况下,您没有阅读我的所有要求吗?我想保留当前页面,所以 clearFilters 或 filter 都不可接受,因为它们会将分页器移回第一页。
  • 好的。我改进了你的问题。我稍后再看看。
  • 为什么不干脆不更新数据表,只使用 ajax 调用来删除行服务器端,并在 ajax 调用完成时使用一些简单的 jquery 来删除客户端?无需过滤或其他任何东西。唯一的小缺点是页面现在包含“rows-1”行。
  • @Kukeltje:如何在客户端删除行? PF('incomeTable') 除了 removeSelection 之外没有任何删除功能。此外,如果我尝试通过删除整个 元素将其从视图中删除,我的表的索引列将不会得到更新,所以会有一个缺失的索引对吗?
  • “缺失”索引是否会导致问题?

标签: primefaces filter datatable


【解决方案1】:

经过一些测试,结果变得相当简单。

就像使用分页时可见的切换列一样(使用 boolean[]),创建一个 String[] 来保存所有过滤器值

private String[] colVisible = new String[] {"", "", "", "", ...};

为每一列添加 filterValue 属性:

<p:column headerText="Header text"
    filterBy="#{item[1]}" filterMatchMode="contains"
    visible="#{bean.colVisible[1]}"
    filterValue="#{bean.filterValue[1]}">
    <h:outputText value="#{item[1]}" />
</p:column>

这样即使更新后过滤器值也将保持不变。然后当我需要清除过滤器时,我只需要将它们全部重置为空白即可。

【讨论】:

  • 酷,不错的解决方案。出于好奇,您是否尝试过使用 6.0 来?如果我没记错的话,在 5.3 和 6.0 之间这方面有些事情发生了变化。小挑剔:colVisible 不应该是 filterValue (和 privagte private ;-))
  • @Kukeltje :我还没有尝试使用 6.0,因为我们的 PM 不允许我们升级,直到我们完成开发阶段,但也许在维护这个网站时。关于colVisible,它用于显示或隐藏列。当您将 p:columnToggler 与分页器一起使用时,如果您更改页面,primeface 表会保留您选择显示的列标题数,但每行显示所有列。所以它使标题和行值不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2017-11-05
相关资源
最近更新 更多