我有一个扩展数据表扩展器的richfaces。我们编写了一个扩展ExtendeddataModel的自己的类。
一切正常,直到以下情况:
结果:datascroller"跳跃"到右边的页面,但是数据表仍然显示为空
经过一些调试后我发现" walk()"在datascroller写入日志之前调用ExtendeddataModel-Implementation的方法:
The requested page isn't found in the model. Paging is reset to page...
我们对新数据使用过滤,排序,推送机制......所以我可以在这里发布一种复杂的环境,但我试着指出最重要的部分。
<h:selectManyCheckbox value=#{controller.filter}>
<f:selectItems value="#{controller.filterOptions} />
<a4j:ajax render="table scroller" />
</h:selectManyCheckbox
<rich:extendeddatatable id="table" ... />
<rich:dataScroller for="table" id="scroller" renderIfSinglePage="false"
page="#{controller.page}"
添加render =&#34; table&#34;对datascroller没有帮助。唯一有帮助的是将渲染放入两个不同的请求中,因此首先只渲染datascroller,然后再渲染数据表。
如果没有2个请求,有没有办法做到这一点?我可以强制执行渲染顺序吗?或者我只是错过了dataScroller / datatable的配置中的一些内容,在重置滚动条后呈现它...
答案 0 :(得分:0)
我能够通过在java代码中手动重置页面来解决此问题。
详细说明我改变了Extendeddatamodel的walk(...)方法,如下所示:
@Override
public void walk(FacesContext context, DataVisitor visitor,
Range range, Object argument){
SequenceRange sequenceRange = (SequenceRange) range;
int firstRow = sequenceRage.getFirstRow();
int rows = myDB.getCount();
if(firstRow > rows){
int fullPages = rows / ROWS_PER_PAGE;
int rest = rows % ROWS_PER_PAGE;
if(rest == 0){
firstRow = rows - ROWS_PER_PAGE;
this.setPage(fullPages);
}else{
firstRow = rows - rest;
this.setPage(fullPages + 1);
}
}
...
// visitor.process(...); stuff
...
}
我仍然相信这个东西正是数据循环器本身应该做的,但至少我当前的问题已经解决了。