2016-08-22 4 views
2

primefaces 데이터 테이블에 '모두 표시'버튼을 사용하고 싶습니다. 그러나 몇 가지 문제가 있습니다.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 것 : 여기에 문제를 demostrates 몇 가지 테스트 코드는 내가 탭을 변경하지 않으면 예상대로

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 행만 표시됨) 세 번째 레코드를 보려면 표의 두 번째 페이지를 클릭 한 다음 '모두 표시'를 클릭하면 테이블이 제대로 업데이트되지 않습니다. 테이블 상단에서 페이 지니 아이터를 제거하지만 (여전히 예상대로) 세 번째 레코드 만 표시합니다. 그리고 나서 모두 표시를 선택 취소하고 데이터 테이블의 첫 번째 페이지로 돌아 가면 이제는 데이터 테이블도 손상됩니다.

ajax update 문을 테이블의 id로 변경하려고 시도했지만 결과가 변경되지 않았습니다.

내가 잘못 했나요? 미리 감사드립니다. 당신은 프로그래밍 방식이 DataTable 구성 요소에 직접적으로 필요한 값을 설정해야

+0

을 사용하여 최종 버전을 만들 수 있습니다. ** Scopeed ** @ Sess ionScoped ** ** @ ViewScoped **로 변경하십시오! –

+0

@YoucefLaidani 작동하지 않았 음 :/제안 해 주셔서 감사합니다! – lucasvw

+1

이 코드를 사용하면 "전체보기"에서 cliking을 사용하여'fullList' 필드를 어떻게 변경해야합니까? –

답변

1

는 (난 그냥 더 읽기 쉽도록 명시 적 firstrows 빈 속성을 사용) :

<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 
} 

가 테스트 Wildfly 10.0.0.JF 2.3.0-m06 (Mojarra) 및 PrimeFaces 6.0.2

+0

위대한 작품입니다. , 고맙습니다! 나는 더 쉬운 방법이 있었으면 좋겠다. – lucasvw

관련 문제