PrimeFaces dataTable:如何捕获每页行数事件?

Dan*_*jel 6 jsf primefaces

我创建了一个PrimeFaces数据表:

<p:dataTable id="locationTable" value="#{bean.object}" var="item"
  paginator="true"
  rows="10" 
  paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink}{LastPageLink} {RowsPerPageDropdown}" 
  rowsPerPageTemplate="5,10,15,20,30,50,100">
  ...
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)

我想保存每页行数的下拉框值.当用户更改值时,我该如何捕获该事件?所以我可以读取并保存其中一个"5,10,15,20,30,50,100"值,以便下次用户返回此页面时自动显示该值.目前,它没有保存,因此每次(重新)加载页面时,它都会返回默认值"10".

Dan*_*rgo 7

你可以这样做:

风景

<h:form id="mainForm">

    <p:dataTable id="locationTable" value="#{datatableBean.list}" var="item"
                 paginator="true" widgetVar="dtVar"
                 rows="#{datatableBean.rows}" 
                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                 rowsPerPageTemplate="1,2,3,4,5,6">
        <p:column>
            #{item.name}
        </p:column>
    </p:dataTable>

    <p:remoteCommand name="persistRows" action="#{datatableBean.saveRows}" process="@this" 
                     update="rows" global="false" />

    <h:outputText id="rows" value="#{datatableBean.rows}" />

    <script>
        jQuery(document).ready(function() {
            dtVar.paginator.rppSelect.change(function() {
                persistRows([{name: 'rows', value: this.value}]);
            });
        });
    </script>
</h:form>
Run Code Online (Sandbox Code Playgroud)

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean
@SessionScoped
public class DatatableBean implements Serializable {

    private int rows;

    private List<SimpleBean> list;

    @PostConstruct
    public void setup() {
        //default rows value
        rows = 2;

        list = new ArrayList<SimpleBean>();
        //ID and Name
        list.add(new SimpleBean(11, "A"));
        list.add(new SimpleBean(22, "B"));
        list.add(new SimpleBean(33, "C"));
    }

    public void saveRows(){
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String rowsStr = (String) map.get("rows");
        rows = Integer.parseInt(rowsStr);
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public List<SimpleBean> getList() {
        return list;
    }

    public void setList(List<SimpleBean> list) {
        this.list = list;
    }

}
Run Code Online (Sandbox Code Playgroud)

这里的策略是扩展与paginator呈现的html 选择标记关联的onchange事件.为了促进这项任务,我在数据表(dtVar)中设置了wigetVar,知道它的客户端api通过dtVar.paginator.rppSelect给我们两个选择.

现在,为了能够将这些选择的值发送到托管bean,我们可以使用remoteCommand.使用remoteCommand组件,我们可以将javascript参数发送到managedbean.我命名的remoteCommand如persistRows并通过调用它我指定使用由所述部件所需的图案的额外的参数:[{名称:"行",值:THIS.VALUE}]([{名称:"nameOfTheVariable" ,value:'valueOfTheVariable'}]).

现在,您可以使用该行属性执行任何操作.