15

Primefaces にデータテーブルがあり、行を追加するときに、データテーブルの最後のページを表示したいと考えています。

私の .xhtml ページは次のとおりです。

<h:form id=...>
...
<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1"/>
...
</h:form>

<h:form id=...>
...
<p:inputText id="txt_description" value="#{templateController.templateDescription}" label="templateDescription">
               <f:validateLength for="txt_name" minimum="1"/>
               <p:ajax event="change"
                     listener="#{calculatePageTable.setPageTableTemplate}"  onsuccess="setTabIndexTT()"/>
               </p:inputText>
...
</h:form>
<script type="text/javascript">
      function setTabIndexTT(){
                    tbl1.getPaginator().setPage(#{calculatePageTable.pageTableTemplate});
                }
      </script>

豆:

@ManagedBean
@SessionScoped
public class CalculatePageTable {

   private int pageTableTemplate = 0;
   private int pageTableField = 0;

   public void setPageTableTemplate() {

      final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
            .findComponent("form:templateTable");
      pageTableTemplate = d.getPageCount() - 1;

   }

   public int getPageTableTemplate() {
      return pageTableTemplate;
   }

   public void setPageTemplateField() {

      final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
            .findComponent("detailsTable:webTemplateUpdateTable");
      pageTableField = (d.getPageCount() - 1);
   }

   public int getPageTableField() {
      return pageTableField;
   }

}

しかし、js 関数 setTabIndexTT() は onsuccess ajax によって呼び出されることはありません...

行を追加するときにデータテーブルの最後のページを設定するにはどうすればよいですか?

Primefaces のバージョンは 3.1.1 です

4

4 に答える 4

14

マネージド Bean で次のコードを試すことができます。

public void setPageDataTable() {
    final DataTable d = (DataTable) FacesContext.getCurrentInstance().getViewRoot()
        .findComponent("form:templateTable");
    int first = 1;
    if (d.getRowCount() % ROWS_DATATABLE == 0) {
        first = (d.getRowCount() - ROWS_DATATABLE);
    }
    else 
    {
        first = (d.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE;
    }
    d.setFirst(first);
}

新しい行を追加するときにこのメソッドを呼び出します

于 2012-04-10T09:42:44.203 に答える
7

datatable widgetVar が dataTableWidget の場合、これを使用します。

<script type="text/javascript">
            $(document).ready(function () {
                dataTableWidget.paginator.setPage(0);
            });
 </script>
于 2013-07-11T14:11:39.783 に答える
2

JavaScriptなしでそれを行います。Primefaces のデータテーブルには、first表示する最初のデータのインデックスである属性があります。

<p:dataTable first="#{calculatePageTable.first}"/>
...
<p:commandButton value="Add a row" action="#{calculatePageTable.addRow}"/>

そしてあなたのバッキングビーン:

public class CalculatePageTable {
    private int first = 1;

    public int getFirst(){
        return first;
    }

    public void addRow(){
        // 1. your stuff for adding the row 
        ...
        // 2. switch to the row
        first = getFirstRowOnLastPage(); 
    }

    private int getFirstRowOnLastPage(){
        ...
    }
}
于 2012-04-04T19:11:56.007 に答える
0

バインディングを使用することで、コード内の明示的な ID を回避できます。

xhtml:

<p:dataTable var="webTemplate" id="templateTable" widgetVar="tbl1" binding="#{calculatePageTable.dataTable" />

豆:

public class CalculatePageTable {
private DataTable dataTable;

public DataTable getDataTable() {
    return dataTable;
}

public void setDataTable(DataTable dataTable) {
    this.dataTable = dataTable;
}

/* See Teg's answer */
public void setPageDataTable() {
    int first = 1;
    if (dataTable.getRowCount() % ROWS_DATATABLE == 0) {
        first = (dataTable.getRowCount() - ROWS_DATATABLE);
    }
    else 
    {
        first = (dataTable.getRowCount()/ROWS_DATATABLE)*ROWS_DATATABLE;
    }
    dataTable.setFirst(first);
}
}
于 2013-05-31T15:13:23.003 に答える