我在页面上有一个按钮,导致我的数据表通过
AJAX请求进行刷新.这样的东西
<h:form id="datatable"> <p:dataTable/> </h:form> <p:commandButton update=":datatable">
除了表格被刷新之外,它还没有进行任何排序,同时仍然显示它是基于以前的值排序的,所以这一切都很好.换句话说,标题仍然突出显示,箭头仍然指向排序方向,但实际上没有排序.显然这不是理想的.
理想情况下,我希望组件在视图状态下保持排序顺序,然后在AJAX请求期间提交正确的参数(以便正确定义排序).我错过了一个参数吗?有其他人有这个问题吗?
从表中可以看出,当我们期待一个排序时,它会发布以下选项:
<componentID>_sortDir <componentID>_sortKey <componentID>_sorting <componentID>_updateBody
当我刷新表单时,这不会发生.如果我只是刷新表,也不会发生(认为我可以通过直接更新组件来处理事情).有没有办法让表刷新正确?
我写了一个扩展到@ truemmer的解决方案.他将排序顺序恢复到默认值,其中我的还原到用户选择的先前排序.
function postAjaxSortTable(datatable) { var selectedColumn = datatable.jq.find('.ui-state-active'); if(selectedColumn.length <= 0) { return; } var sortorder = "ASCENDING"; if(selectedColumn.find('.ui-icon-triangle-1-s').length > 0) { sortorder = "DESCENDING"; } datatable.sort(selectedColumn,sortorder); }
更新与truemmer的作品相同的表,如下所示:
<p:commandButton value="refresh" action="#{tableController.refreshPrices}" update="myTable" oncomplete="postAjaxSortTable(myTableWidget)" />
编辑:Primefaces 4.0 MultiSort支持
function postAjaxSortTable(datatable) { var selectedColumn = undefined; // multisort support if(datatable && datatable.cfg.multiSort) { if(datatable.sortMeta.length > 0) { var lastSort = datatable.sortMeta[datatable.sortMeta.length-1]; selectedColumn = $(document.getElementById(lastSort.col)); } } else { selectedColumn = datatable.jq.find('.ui-state-active'); } // no sorting selected -> quit if(!selectedColumn || selectedColumn.length <= 0) { return; } var sortorder = selectedColumn.data('sortorder')||"DESCENDING"; datatable.sort(selectedColumn,sortorder,datatable.cfg.multiSort); }