【问题标题】:Primefaces DataTable filter or paginator hinders the rendering of sequential fetch requestsPrimefaces DataTable 过滤器或分页器阻碍了顺序获取请求的呈现
【发布时间】:2016-08-04 18:43:39
【问题描述】:

我正在使用 Primefaces DataTable 组件。用户在点击按钮之前做出一些城市地区服务类型的选择,数据表将充满所需的城市服务(医院、学校等),位于城市的所需地点。下面的代码只包含获取按钮和表格本身。

当您获取所需的第一个结果时,没有任何问题。一切都很好,分页器运行良好。当您按名称过滤结果时,问题就开始了。它们实际上也得到了很好的过滤,但是在过滤完成之后;如果您对城市、地区或服务做出其他选择并尝试获取它们;数据表的列被填充 '| 0 | (空) | (空)|'行(我猜是因为 ID 列是 int 类型,而另外两个是字符串)。附加信息:新创建的空行数与之前的过滤结果完全相同。

我进行了必要的调试,发现后端一切正常。我得到了所有获取的对象。实际上,当我在过滤器栏中输入任何内容时,新结果也会暴露出来。这似乎完全是客户端渲染的问题,虽然我找不到解决方法。

任何帮助将不胜感激。

更新:经过几个小时的工作,我得出结论,原因可能不是过滤器,而是分页器。因为当我关闭分页器并获得一个完整的可滚动表格时,一切都运行良好。仍然不确定确切的原因,因此我根据此编辑了问题主题。

ps:我正在使用 Primefaces 5.3、JSF 2.2 Mojarra、JDK 1.7、TomEE Plume

    <p:commandButton action="#{filterByLocation.fetchServicesByLocation}" id="elbuton" value="Fetch" icon="ui-icon-check" onclick="PF('servisWidget').clearFilters();" update="servisList" />

    <p:dataTable id="servisList" paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" rows="10" var="loc" value="#{filterByLocation.finalResults}"
     widgetVar="servisWidget">
      <p:column headerText="ID">
        <h:outputText value="#{loc.id}" />
      </p:column>
      <p:column headerText="NAME" filterBy="#{loc.name}" filterFunction="#{filterByLocation.filterResults}">
        <h:outputText value="#{loc.name}" />
      </p:column>
      <p:column headerText="SERVICE NAME">
        <h:outputText value="#{loc.serviceName}" />
      </p:column>
    </p:dataTable>

我的支持 bean(为清楚起见排除了 getter/setter):

@ManagedBean
@ViewScoped
public class FilterByLocation {

    private List<LocationEntity> cities;
    private List<LocationEntity> districtSelection;
    private List<LocationEntity> finalResults = new ArrayList<LocationEntity>();
    private List<Integer> selectedNodes = new ArrayList<Integer>();

    private String filterText;
    private String filterName; 
    private int city;
    private int district;

    public FilterByLocation() {
        setCities(LocationTreeDAO.fetchCities());
    }

    public void listDistricts() {
        setDistrictSelection(LocationTreeDAO.fetchDistricts(city));
    }

    public void selectNode(NodeSelectEvent node) {
        TreeNode treeNode = node.getTreeNode();
        LayerEntity layer = (LayerEntity) treeNode.getData();
        selectedNodes.add(Integer.valueOf(layer.getId()));
    }

    public void unselectNode(NodeUnselectEvent node) {
        TreeNode treeNode = node.getTreeNode();
        LayerEntity layer = (LayerEntity) treeNode.getData();
        selectedNodes.remove(Integer.valueOf(layer.getId()));
    }

    public void fetchServicesByLocation() {
        setFinalResults(LocationTreeDAO.fetchFilteredServices(getCity(), getDistrict(), getSelectedNodes(), getFinalResults()));
        setFilterText("");
    }


    public boolean filterResults(Object value, Object filter, Locale locale) {

        setFilterText((filter == null) ? null : filter.toString().trim());
        if (filterText == null || filterText.equals("")) {
            return true;
        }
        if (value == null) {
            return false;
        }
        String searched = value.toString().toUpperCase();
        filterText = filterText.toUpperCase();

        if (searched.contains(filterText)) {
            return true;
        } else {
            return false;
        }


    }

描述情况的两个屏幕截图 before after

【问题讨论】:

  • 您在浏览器端看到任何错误消息吗?
  • @PaulWasilewski 一点也不。浏览器端没有错误,服务器端也没有。只是给我带来了三个没有数据的列(除了它们似乎有默认值 | 0 | (无 | (nothing) | 正如我所说。“无”实际上是一个空白,可能是一个“空”传递给预期的字符串)跨度>
  • 你的filterFunction #{filterByLocation.filterResults}的内容是什么?
  • 添加了backing bean
  • 你能发一个minimal reproducible example吗?另见stackoverflow.com/tags/jsf/info 命令按钮是否相关?它发挥作用吗?尝试删除update="servisList"

标签: jsf primefaces filter datatable


【解决方案1】:

filterFunction 参数 &lt;p:column ... filterFunction="#{filterByLocation.filterResults}" ...&gt; 不是必需的。

  1. 将语句更改为

&lt;p:column headerText="NAME" filterBy="#{loc.name}" filterMatchMode="contains"&gt;

  1. 为过滤后的值添加List

&lt;p:dataTable ... filteredValue="#{filterByLocation.filteredResults} ...&gt;

@ManagedBean
@ViewScoped
public class FilterByLocation {
    ...
    private List<LocationEntity> filteredResults;
    ...
}

【讨论】:

  • 实际上我首先尝试了这个更简单的方法,尽管它产生了完全相同的结果。
  • 应该没问题,这种情况下不需要filterFunction。
  • 不幸的是,这并没有改变这种情况。
  • @AlpA。请提供支持 bean 的完整代码。你的吸气剂可能有问题?
  • 其余代码仅包含您在其中看到的所有私有字段的 getter/setter,这些字段由 eclipse 自动生成(source->generate)。我也检查了它们,它们工作得很好。
猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2014-11-10
相关资源
最近更新 更多