2016-08-22 6 views
2

primefacesデータテーブルの[すべて表示]ボタンを使用したいと思いますが、何か問題があります。ここでは、問題をdemostratesいくつかのテストコードは次のとおりです。Primefaces DataTableの[すべて表示]ボタン

Test.xhtml:

  ... 
      <h:form> 
       <p:selectBooleanCheckbox value="#{testBean.showAll}" itemLabel="Show All"> 
        <p:ajax update="@form"/> 
       </p:selectBooleanCheckbox> 

       <p:panel id="test"> 
        <p:dataTable id="values" var="value" value="#{testBean.fullList}" filteredValue="#{testBean.filteredList}" paginatorAlwaysVisible="false" 
           paginator="#{!testBean.showAll}" rows="#{!testBean.showAll ? 2 : null }" widgetVar="valuesTable" 
           emptyMessage="No records found."> 


         <p:column id="enum" sortBy="#{value.toString()}" filterBy="#{value.toString()}" filterMatchMode="contains"> 
          <f:facet name="header"> 
           <h:outputText value="Enum" /> 
          </f:facet> 
          <h:outputText value ="#{value.toString()}"/> 
         </p:column> 
         <p:column id="name" sortBy="#{value.name}" filterBy="#{value.name}" filterMatchMode="contains"> 
          <f:facet name="header"> 
           <h:outputText value="Name" /> 
          </f:facet> 
          <h:outputText value="#{value.name}" /> 
         </p:column> 
        </p:dataTable> 
       </p:panel> 
      </h:form> 
      ... 

そして、ここでTestBean.javaだ:

import javax.inject.Named; 
import javax.enterprise.context.SessionScoped; 
import java.io.Serializable; 
import java.util.Arrays; 
import java.util.List; 

@Named(value = "testBean") 
@SessionScoped 
public class TestBean implements Serializable { 

    public static enum Value { 

     ONE, TWO, THREE; 

     public String getName() { 
      return name().toLowerCase(); 
     } 

     @Override 
     public String toString() { 
      return this.name(); 
     } 
    } 

    /** 
    * Creates a new instance of TestBean 
    */ 
    public TestBean() { 
    } 

    private boolean showAll = false; 
    private List<Value> fullList = Arrays.asList(Value.values()); 
    private List<Value> filteredList; 

    public boolean isShowAll() { 
     return showAll; 
    } 

    public void setShowAll(boolean showAll) { 
     this.showAll = showAll; 
    } 

    public List<Value> getFullList() { 
     return fullList; 
    } 

    public void setFullList(List<Value> fullList) { 
     this.fullList = fullList; 
    } 

    public List<Value> getFilteredList() { 
     return filteredList; 
    } 

    public void setFilteredList(List<Value> filteredList) { 
     this.filteredList = filteredList; 
    } 

} 

私はタブを変更しない場合は、ページが期待どおりに動作します: 'すべて表示'ボタンを切り替えると、3つの値すべてを表示するか、2つだけ表示するように表が更新されます。ただし、show allがチェックされていない場合(2行だけが表示されている)、3番目のレコードを表示するためにテーブルの2番目のページをクリックし、[すべて表示]をクリックすると、テーブルは正しく更新されません。テーブルの上部から(期待どおり)ページネイザーを削除しますが、それでも3番目のレコードしか表示されません。そして、私がすべて表示をオフにして、データテーブルの最初のページに戻ると、それは今も壊れています。

私はajaxの更新ステートメントをテーブルのIDに変更しようとしましたが、結果は変更されませんでした。

何か間違っていますか?前もって感謝します。

+0

あなたは別のScoped ** @ Sess ionScoped ** ** @ ViewScoped **に変更してください! –

+0

@YoucefLaidaniうまくいきませんでした:/ありがとうございました! – lucasvw

+1

このコードでは、 "show all"のclikingはどのように 'fullList'フィールドを変更すると思いますか? –

答えて

1

あなたは、プログラムDataTableコンポーネント(私はもっと読みやすくするため、明示的firstrows Beanプロパティを使用)に直接必要な値を設定する必要があります。

<h:form> 
    <p:selectBooleanCheckbox value="#{testBean.showAll}" itemLabel="Show All"> 
     <p:ajax update="@form" /> 
    </p:selectBooleanCheckbox> 

    <p:panel id="test"> 
     <p:dataTable id="values" var="value" value="#{testBean.fullList}" 
      filteredValue="#{testBean.filteredList}" paginatorAlwaysVisible="false" 
      paginator="#{!testBean.showAll}" first="#{testBean.first}" rows="#{testBean.rows}" 
      widgetVar="valuesTable" emptyMessage="No records found."> 


      <p:column id="enum" sortBy="#{value.toString()}" filterBy="#{value.toString()}" 
       filterMatchMode="contains"> 
       <f:facet name="header"> 
        <h:outputText value="Enum" /> 
       </f:facet> 
       <h:outputText value="#{value.toString()}" /> 
      </p:column> 
      <p:column id="name" sortBy="#{value.name}" filterBy="#{value.name}" 
       filterMatchMode="contains"> 
       <f:facet name="header"> 
        <h:outputText value="Name" /> 
       </f:facet> 
       <h:outputText value="#{value.name}" /> 
      </p:column> 
     </p:dataTable> 
    </p:panel> 
</h:form> 

上でテスト
@Named 
@ViewScoped 
public class TestBean implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    public static enum Value 
    { 
     ONE, TWO, THREE; 

     public String getName() 
     { 
      return name().toLowerCase(); 
     } 

     @Override 
     public String toString() 
     { 
      return name(); 
     } 
    } 

    private boolean showAll = false; 
    private int first = 0; 
    private int rows = 2; 
    private List<Value> fullList = Arrays.asList(Value.values()); 
    private List<Value> filteredList; 

    public boolean isShowAll() 
    { 
     return showAll; 
    } 

    public void setShowAll(boolean showAll) 
    { 
     this.showAll = showAll; 
     first = 0; 
     rows = showAll ? 0 : 2; 
     filteredList = null; 

     // get the FacesContext instance 
     FacesContext context = FacesContext.getCurrentInstance(); 

     // get the current component (p:selectBooleanCheckbox) 
     UIComponent component = UIComponent.getCurrentComponent(context); 

     // find DataTable within the same NamingContainer 
     DataTable table = (DataTable) component.findComponent("values"); 

     // reset first row index 
     table.setFirst(first); 

     // reset last row index 
     table.setRows(rows); 

     // reset filterd value 
     table.setFilteredValue(null); 
    } 

    // all other getters/setters 
} 

WildFlow 10.0.0.Final JSF 2.3.0-m06(Mojarra)とPrimeFaces 6.0.2

+0

これは素晴らしい、 ありがとうございました!私は確かに簡単な方法があったと思うが。 – lucasvw

関連する問題