【问题标题】:PrimeFaces: Get current column sort order in JavascriptPrimeFaces:在 Javascript 中获取当前列排序顺序
【发布时间】:2013-01-14 03:42:50
【问题描述】:

我目前正在尝试在用户重新排序时获取 PrimeFaces 数据表中列的当前顺序。由于服务器端事件不提供任何参数,因此我决定使用 JavaScript 处理程序来执行此操作。

function onColumnReorder(glossary) {
    var sortedColumnNames = ...
}

“词汇表”是我的数据表小部件变量。问题是:我现在如何按当前顺序检索列名?请注意,我不是在谈论表格数据排序,而只是在谈论列在表格中出现的当前顺序(从左到右) - 当然这可能会改变,因为“draggableColumns”设置为 true。

感谢您的任何建议和问候 帕斯卡

【问题讨论】:

  • 您要处理列重新排序还是排序。列重新排序是指替换或重新定位表中的列,排序是按某些列中的值(asc 或 desc)排序。对于排序,您有“排序”ajax 事件,其中包含对哪一列进行排序的信息。
  • 我希望能够将用户的列排序(不是值排序)存储在他的个人偏好中。
  • 您也许可以在数据表上使用colReorder ajax 事件,并在支持bean 中按ID 查找数据表组件,并且您有getColumns 方法,它返回列列表。
  • 这样也行——如果不是更好的话。虽然我怎样才能检索 Datatable 组件?我的页面中有不止一个,由 生成。不过,我确实知道他们各自的 ID。
  • 您可以通过编程方式将<p:dataTable> 与您的托管bean 绑定,但这要求您的托管bean 至少有@SessionScoped

标签: java javascript jsf primefaces datatable


【解决方案1】:

首先在datatable上定义colReorder AJAX事件:

<p:ajax event="colReorder" listener="#{myBean.onColReorder}"/>

onColReorder 方法中,使用UIViewRoot#findComponent() 方法通过ID 查找您的数据表。找到 DataTable 对象后,这很容易。使用getColumns()方法获取onColReorder()中的列列表:

FacesContext fc = FacesContext.getCurrentInstance();
DataTable myDatatable = (DataTable) fc.getViewRoot().findComponent("your_datatable");
List<UIColumn> columns = myDatatable.getColumns();

【讨论】:

  • 为什么即使我在数据表上显示了 20 列(我正在使用 p:columns),columns.get(1).getHeaderText() 仍显示空字符串?
  • 问题是关于 JavaScript 的,这是服务器端的。无论如何,在 PF5 上它就像 public void onColReorder(AjaxBehaviorEvent event) { DataTable myDatatable = (DataTable)event.getComponent(); ... } 一样干净
【解决方案2】:
var th =$(myTableWidgetVar.jqId).find('.ui-state-active');

返回 id 为 myTableId:myColumnId 的 th,因此您知道哪一列启用了排序。

您现在可以阅读三角形组件:

th.find('.ui-sortable-column-icon');

并检查它定义了哪个类:

  • 'ui-icon-triangle-1-n' 用于升序排序

  • 'ui-icon-triangle-1-s' 用于降序排序

如果您使用LazyDataModel,您将在排序顺序更改时收到服务器回调。

【讨论】:

  • 不幸的是,我找不到比检查样式类更优雅的解决方案。此信息不存储在内部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2013-05-07
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多