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