过去几天我面临的任务对我来说都有问题。
我正在使用rich:dataTable
自己的过滤和排序列。在后端使用标准排序和过滤bean进行简单输入或选择。我的问题是,我需要记住这种排序和过滤值,许多表格在某些情况下恢复它们 - 例如:用户使用后退按钮(最重要的情况)。我知道如何处理浏览器后退按钮,但我不知道必须以一些简单明了的方式保存和恢复我的值。重要的是 我无法使用 rich:extandedDataTable
并使用bean的视图范围。
(其中一个解决方案是使用会话范围bean来管理s& f,但是为一个表单创建一个bean是非常昂贵的,并且制作一个这样的bean在我想要使用它的方式中使用起来非常复杂。 )
所以,我的问题是:我怎么能这样做?处理这类事情的最佳做法是什么?我应该走哪条路?
我正在使用RF 4.3和Mojarra 2.1.17(我认为这不是那么重要)。
答案 0 :(得分:2)
理想情况下,stateVar
属性非常适合您的需求,但有关它的文档很少,似乎没有人真正知道如何处理它。我会推荐以下hack,它基本上可以手动保存和恢复数据表变量的状态
如果您只想保留表的当前过滤器状态,则RF数据表具有getComponentState()
方法,基本上就是这样。如果您想要存储特定值,则必须自己深入研究数据表。无论您选择什么,您都必须在组件的生命周期中的某个时间进行操作
定义一个合适的<f:event/>
侦听器,您将在其中捕获数据表的状态变量。我推荐preValidate
。
<rich:extendedDataTable binding="#{bean.table}" ...>
<f:event type="preValidate" listener="bean.saveTableState"/>
</rich:extendedDataTable>
然后在您的支持bean中定义将从表绑定
中检索状态变量的方法 public void saveTableState(ComponentSystemEvent evt){
UIExtendedDataTable table = (UIExtendedDataTable)evt.getComponent();
//now you have the table, you can get what you need from it
DataComponentState savedState = table.getComponentState(); //this object obtained here you can restore to reset the table to it's condition when you obtained the state.
//or go into the table's hierarchy to retrieve specific values
Iterator<UIComponent> cols = table.columns();
while(cols.hasNext()){
UIColumn col = (UIColumn)cols.next();
col.getFilterValue(); //Retrieve the current filter value on the column
}
}
根据您的偏好,在组件的生命周期中找到合适的点来恢复值。我会推荐preRenderComponent
。
public void restoreTableConditions(ComponentSystemEvent evt){
table.restoreState(FacesContext.getCurrentInstance(),savedState); //restore the DataComponentState from wherever you stashed it
}