我能够让它工作。
本质上,我们需要在 SortMeta 对象中提供 UIColumn 以使其工作。对于渲染时的初始排序,我必须在我的 bean 中找到组件并将其分配给 sortMeta。
下面是我在视图 xhtml 中的代码
<p:dataTable id="transDataTable" var="trans"
value="#{myBean.transModel}" paginator="true" rows="50"
paginatorAlwaysVisible="false" lazy="true"
sortMode="multiple" sortBy="#{myBean.preSortOrder}"
resizableColumns="true">
<p:column headerText="User" sortBy="#{trans.user.name}" >
#{trans.user.name}
</p:column>
<p:column headerText="Company" sortBy="#{trans.companyName}">
#{trans.companyName}
</p:column>
<p:column headerText="Join Date" id="joinDateTime"
sortBy="#{trans.joinDateTime}" >
<h:outputText value="#{trans.joinDateTime}" />
</p:column>
</p:dataTable>
这是我在 @PostConstruct 上调用的 bean 代码
/*
* method to build initial sort order for multisort
*/
private void buildSortOrder() {
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
UIComponent column = viewRoot.findComponent("transDataTable:joinDateTime");
SortMeta sm1 = new SortMeta();
sm1.setSortBy((UIColumn)column);
sm1.setSortField("joinDateTime");
sm1.setSortOrder(SortOrder.DESCENDING);
preSortOrder.add(sm1);
}
我不确定这是执行此操作的正确方法,但它确实有效。当我们必须在 bean 代码中使用视图中的 id 时,我通常会感到不舒服,因为当人们不小心时,这会引入错误。
感谢@CagatayCivici 的快速提示。