我有一个选项卡视图,在每个选项卡视图中都有一个数据表。
这是我的代码段:
<p:tabView orientation="left" id="myTabs" activeIndex="#{myBean.currentTabIndex}" dynamic="true" cache="false">
<p:ajax event="tabChange" immediate="true" update="@form" listener="#{myBean.onTabChange}" />
<p:tab id="vehicleTab"
<ui:include src="/components/vehicle.xhtml" />
</p:tab>
----------- other tabs --------------
</p:tabView>
Vehicles.xhtml是:
<p:dataTable id="myTable" var="v" value="#{myBean.vehicles}" rowIndexVar="rowIndex">
<p:ajax event="sort" listener="#{myBean.sort}" />
<p:column id="vehicleid" sortBy="#{myBean.object}" sortFunction="#{myBean.sortVehicles}">
<h:outputText value="v.id" />
</p:column>
<p:column id="type" sortBy="#{myBean.object}" sortFunction="#{myBean.sortVehicles}">
<h:outputText value="v.typ" />
</p:column>
//other columns
<p:dataTable
如果您观察到,所有列 v.object 的 sortBy 属性都相同 此v.object具有要排序的与排序相关的元数据。
当我单击列时,排序工作正常,排序图标正确显示。但是,如果我导航到另一个选项卡,然后返回到“车辆”选项卡,则所有排序图标都显示相同的desc或asc先前排序图标。
调试代码时,我发现如果单击列进行排序,则会调用数据表渲染器的类解码方法;
@Override 公共无效的解码(FacesContext上下文,UIComponent组件){ }
此方法内
DataTableFeature
类具有解码方法,它采用了排序列,并根据框架提供的上下文参数进行排序。
此方法执行完成后,
@Override 公共无效encodeEnd(FacesContext上下文,UIComponent组件)引发IOException {}
调用此方法并准备排序图标。
但是当我切换选项卡并返回时,不会直接调用 decode 方法,而会调用 encodeEnd 方法,为所有列准备相同的排序图标。
这是较早的实现,是否可以在不更改 sortBy 属性的情况下解决此问题?
答案 0 :(得分:0)
我认为这类似于:p:datatable loses sort column and order after ajax refresh
因为tabView的更改(如果您使用的是真实的TabView,则每次更改标签时实际上都是AJAX请求。