【问题标题】:Prevent primefaces datatable to jump on first page after rendering防止primefaces数据表在渲染后跳转到第一页
【发布时间】:2019-09-30 07:17:36
【问题描述】:

有没有办法防止 primefaces 数据表在添加或删除项目后跳回第一页?

示例: 我有一个带有惰性数据模型和分页的数据表。 目前我有两页。现在我添加一个项目,并在渲染分页器后跳转到第一页。

这可能不会发生吗?

    <p:dataTable id="persAnwTbl" 
    var="_anweisung"
    value="#{handler.dataModel}"
    style="width:100%"
    widgetVar="persAnwTblVar"
    emptyMessage="#{messages.noData}"
    lazy="true"
    paginatorAlwaysVisible="true"
    paginator="true"
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {RowsPerPageDropdown} {NextPageLink} {LastPageLink}"
    currentPageReportTemplate="{totalRecords} #{labels.datensaetze} - #{labels.seite} {currentPage} / {totalPages}"
    rows="#{handler.rows}"
    rowsPerPageTemplate="5,10,15,20,30,50,100,200,500,1000"
    binding="#{handler.dataTable}"
    sortBy="#{_anweisung.module.displayName}"
    filteredValue="#{handler.filteredValues}">
...
...
...
/>

编辑: 2019-05-13 --- 03:05pm

<p:dataTable id="persAnwTbl" var="_anweisung"
                             value="#{handler.dataModel}"
                             style="width:100%"
                             widgetVar="persAnwTblVar"
                             emptyMessage="#{messages.noData}"
                             lazy="true"
                             paginatorAlwaysVisible="true"
                             paginator="true"
                             paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {RowsPerPageDropdown} {NextPageLink} {LastPageLink}"
                             currentPageReportTemplate="{totalRecords} #{labels.datensaetze} - #{labels.seite} {currentPage} / {totalPages}"
                             rows="#{handler.rows}"
                             rowsPerPageTemplate="5,10,15,20,30,50,100,200,500,1000"
                             binding="#{handler.dataTable}"
                             sortBy="#{_anweisung.module.displayName}"
                             filteredValue="#{handler.filteredValues}"
                             first="#{handler.first}">

...
...
...
</p:dataTable>

【问题讨论】:

    标签: jsf primefaces datatable


    【解决方案1】:

    当然,只需将显示的第一行的偏移量(即当前页面的开头)绑定到模型的字段:

    <p:dataTable
     <!-- ... -->
     first="#{handler.first}"
     <!-- ... -->
    >
    </p:dataTable>
    

    【讨论】:

    • 刚刚添加,但不会添加。除了添加此属性并将其绑定到支持 bean 中的变量之外,还有什么或要做的吗?顺便说一句:bean 是 @ViewAccessScoped
    • @LStrike:它应该可以工作...在 Stackoverflow 中查看类似的 Q/A
    • @LStrike:抱歉,到目前为止我还没有与@ViewAccessScoped 合作过。你可以吗?确认模型的“第一个”属性的设置器将在页面更改时调用,或者 getter 将在加载时调用?
    • 第一次加载时调用setter,“first”的值为null。但是在更改时不会调用 getter。
    • 实际上应该相反 - 在第一次加载时,应该调用 getter 来检查要显示的行,在页面更改时应该调用 setter 来保持当前的“第一”行在模型中。此外,由于您支持延迟加载,您可以在处理“延迟”回调时尝试设置模型的“第一个”字段。
    【解决方案2】:

    Smutje 的回答是正确的,但不足以让我的代码正常工作。(我使用的是 PF 6.0.19 btw)。

    只需几个步骤即可完成整个工作

    1. first 属性添加到您的p:datatable(Smutje 的回答)

    2. 您还必须在 bean 侦听器方法中调用 DataTable.setFirst()

      例如

      public void addItem(){
          //Your add item code
          //Assume your `first` getter method can be called by handler.getFirst()
          ((DataTable) FacesContext.getCurrentInstance.getViewRoot().findComponent("YOUR_DATATABLE_ID")).setFirst(handler.getFirst());
      } 
      

    【讨论】:

    • 只有在不更新完整数据表时才需要。否则我会认为这是多余的。
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多