Primefaces数据表排序和过滤直到rowSelect才起作用
Posted
技术标签:
【中文标题】Primefaces数据表排序和过滤直到rowSelect才起作用【英文标题】:Primefaces datatable sorting and filtering not working until rowSelect 【发布时间】:2013-04-21 14:31:33 【问题描述】:我知道这个问题可能是重复的,但我真的找不到我的问题的解决方案;我的问题是排序和过滤等数据表功能不起作用,除非我在关闭对话框后单击任何行以显示详细信息对话框,所有“排序、过滤”都按预期正常工作。
这是我的代码: Bean.java
@ViewScoped
public class HomeBean implements Serializable
private List<Ticket> filteredTickets;
private List<Ticket> tickets;
private Ticket selectedTicket;
private Ticket[] selectedTickets;
public HomeBean()
super();
@PostConstruct
public void init()
getData();
private void getData()
TicketFacade service;
service = TicketFacade.getInstance();
try
tickets = service.selectTickets();
catch (Exception e)
logger.error(Utilities.printStackTrace(e));
// setter & getters
@PreDestroy
public void finalize()
logger.debug("@PreDestroy");
这是xhtml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view contentType="text/html">
<h:head>
<f:facet name="first">
<meta content='text/html; charset=UTF-8' http-equiv="Content-Type" />
<title>Home Page</title>
</f:facet>
<script type="text/javascript">
window.history.forward();
function noBack()
window.history.forward();
</script>
</h:head>
<h:body id="body-view" onload="noBack();"
onpageshow="if (event.persisted) noBack();" onunload="">
<f:view locale="#userManager.locale">
<h:form id="Ticket">
<p:dataTable var="ticket" value="#homeBean.tickets"
rowKey="#ticket.id" paginator="true" rows="15"
selection="#homeBean.selectedTicket" selectionMode="single"
filteredValue="#homeBean.filteredTickets" id="ticketsTable"
emptyMessage="#lbl.noTicketsFound"
style="margin-bottom:10px;margin-top:10px;">
<p:ajax event="rowSelect" update=":Ticket:display"
oncomplete="ticketDialog.show()" />
<f:facet name="header">#lbl.listOfTickets</f:facet>
<p:column headerText="#lbl.tblId" sortBy="#ticket.id"
filterBy="#ticket.id" id="id">
<h:outputLink value="#edit.xhtml?id=#ticket.id">#ticket.id</h:outputLink>
</p:column>
<p:column headerText="#lbl.tblTitle" sortBy="#ticket.title"
filterBy="#ticket.title" id="title"> #ticket.title
</p:column>
</p:dataTable>
<p:dialog header="#lbl.moreTicketDetails" widgetVar="ticketDialog"
resizable="true" showEffect="explode"
hideEffect="explode" closable="true" draggable="true">
<h:panelGrid id="display" columns="2" cellpadding="4"
dir="#lbl.dir">
<h:outputText for="shortDescription"
value="#lbl.shortDescription" />
<h:outputText id="shortDescription"
value="#homeBean.selectedTicket.shortDescription" />
<h:outputText for="callCenterList" value="#lbl.callcenters" />
<h:outputText id="callCenterList"
value="#homeBean.selectedCallCenters">
</h:outputText>
</h:panelGrid>
</p:dialog>
</h:form>
</f:view>
</h:body>
</f:view>
</html>
【问题讨论】:
应该有链接或按钮将用户导航到此页面找到它并设置ajax=false
。
@ÖmerFarukAlmalı 你确定理解了主要问题吗?
@LuiggiMendoza 是的,看起来就像类似于this的视图状态错误
@ÖmerFarukAlmalı 现在我也了解了问题的可能原因。谢谢。
有人可以创建一个minimal reproducible example 来重现这个吗? 5 票,没有人这样做。我无法使用组合了选择和排序/过滤的展示柜中的简单示例来重现。
【参考方案1】:
前段时间我在屏幕上看到过类似的问题。当页面未完全呈现时,不会发生排序和过滤。出于测试目的,您能否尝试删除 java 脚本并尝试。 另一种调试方法是使用 chrome hit f12 并查看网络选项卡以找出 ajax 调用。希望这会有所帮助。
【讨论】:
【参考方案2】:我有同样的问题,在我的情况下,我不只是在我的“setSelected”中设置选定的对象,我也在对选定的对象进行一些操作。问题是:在选择任何行之前调用“setSelected”,使用 setSelected(null)。如果你用这个“null”值做任何操作,你可能会遇到严重的问题。解决方案是在执行所需操作之前检查 null。
我不知道您的问题是否相同,但是由于您没有发布“setSelected”的代码,因此可能是这样。
【讨论】:
这很可能发生在您还需要一个需要所选项目的 ajax 事件时,对吧?以上是关于Primefaces数据表排序和过滤直到rowSelect才起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用o:form进行排序时删除了PrimeFaces数据表过滤includeRequestParams =“true”[重复]