我们使用Primefaces数据表组件进行排序,分页和LazyDataModel
以显示搜索结果。搜索页面的辅助bean为ViewScoped
。
从搜索结果列表中,用户可以选择结果项目以查看详细信息。这被实现为新的页面请求,例如, <h:link value="Show Details" outcome="showDetails?id=11234"/>
。通过单击浏览器后退按钮,用户将导航回搜索结果列表。
问题是数据表将再次处于初始状态,因此它不会显示最后选择的排序顺序和页面。在大多数浏览器中就是这种情况,只有Firefox 11似乎将这些DOM更改保留在缓存中。既不是IE也不是Chrome。
有人有一个很好的方法来处理这个问题吗?我们实际上不需要“ajaxified”排序和分页。我们宁愿通过ViewParams处理所有内容,但这似乎不受primefaces的支持。
答案 0 :(得分:1)
我也碰到了这个,我开发了一个可能有用的编码模式。它实际上不是PrimeFaces的东西(我也在使用它) - 更多的是使用与JSF 2书签标记的链接的技术。
在标记中,我包含页面的所有参数,如下所示:
<f:metadata>
<f:viewParam name="orderID" value="#{bean.orderID}" />
<f:viewParam name="sortMode" value="#{bean.sortMode}" />
<f:viewParam name="firstRecord" value="#{bean.firstRecord}" />
<f:viewParam name="pageSize" value="#{bean.pageSize}" />
</f:metadata>
这些值中的每一个都在支持bean中备份,如果它们未设置,则会生成合适的默认值。例如:
public int getPageSize() {
if (pageSize < MIN_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
if (pageSize > MAX_PAGE_SIZE) pageSize = DEF_PAGE_SIZE;
return pageSize;
}
可以按如下方式生成此视图的链接:
现在,您实现用户控件来更改这些值,并在每次更改时重新生成表。您仍然应该使用AJAX - 例如:
<p:spinner value=#{bean.pageSize} >
<p:ajax update="tableID" />
</p:spinner>
在setter方法中,你必须触发表的重新生成,但这就是它的要点。我希望这会有所帮助。
更新:
要处理分页,您只需要为首页,上一页,下一页等添加链接。链接将如下所示:
<h:link value="First Page" outcome="thisPage">
<f:param name="orderID" value="#{bean.orderID}" />
<f:param name="sortMode" value="#{bean.sortMode}" />
<f:param name="firstRecord" value="0" />
<f:param name="pageSize" value="#{bean.pageSize}" />
</h:link>
<h:link value="Next Page" outcome="thisPage">
<f:param name="orderID" value="#{bean.orderID}" />
<f:param name="sortMode" value="#{bean.sortMode}" />
<f:param name="firstRecord" value="#{bean.nextRecord}" />
<f:param name="pageSize" value="#{bean.pageSize}" />
</h:link>
等。您需要在辅助bean中实现属性以计算 firstRecord param应该是什么。