Richfaces extendeddatatable和datascroller - 页面重置时的渲染顺序

时间:2014-09-01 08:30:10

标签: richfaces

我有一个扩展数据表扩展器的richfaces。我们编写了一个扩展ExtendeddataModel的自己的类。

一切正常,直到以下情况:

  1. 转到datascroller的最后一页
  2. 使用导致较少数据量的任何过滤器,因此最后一页不再存在
  3. 结果: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的配置中的一些内容,在重置滚动条后呈现它...

1 个答案:

答案 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
...

 }

我仍然相信这个东西正是数据循环器本身应该做的,但至少我当前的问题已经解决了。