2016-08-22 6 views
2

Ich möchte eine 'Show All' Schaltfläche für eine Primafaces Datatable haben, jedoch habe ich einige Probleme. Hier einige Test-Code, der das Problem demostrates:Schaltfläche 'Alle anzeigen' für 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> 
      ... 

Und hier ist 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; 
    } 

} 

Wenn ich nicht Tabs wechseln, kann die Seite als erwartet : Wenn Sie die Schaltfläche "Alle anzeigen" aktivieren, wird die Tabelle so aktualisiert, dass alle drei oder nur zwei Werte angezeigt werden. Wenn jedoch show all nicht aktiviert ist (es werden nur 2 Zeilen angezeigt) und ich auf die zweite Seite der Tabelle klicke, um den dritten Datensatz anzuzeigen, und dann auf "Show All" klicke, wird die Tabelle nicht ordnungsgemäß aktualisiert. Es entfernt (wie erwartet) den Paginator vom oberen Rand der Tabelle, zeigt aber immer noch nur den dritten Datensatz an. Und wenn ich dann die Option Alle anzeigen deaktivieren und zurück zur ersten Seite der Datentabelle navigieren, ist es jetzt auch kaputt.

Ich habe versucht, die AJAX-Update-Anweisung auf die ID der Tabelle zu ändern, aber das hat die Ergebnisse nicht geändert.

Mache ich etwas falsch? Danke im Voraus.

+0

können Sie versuchen mit einem differentiellen Scoped ** @ Sess ionScoped ** ändere es zu ** @ ViewScoped **! –

+0

@ YoucefLaidani Hat nicht funktioniert:/Danke für den Vorschlag! – lucasvw

+1

Mit diesem Code, wie soll cliking auf "show all" das Feld 'fullList' ändern? –

Antwort

1

Sie müssen programmatisch die Werte legen Sie direkt auf der DataTable Komponente benötigen (I verwendet explizite first und rows Bean-Eigenschaften nur für mehr Lesbarkeit):

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

und

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

Getestet auf Wildfly 10.0.0.Final mit JSF 2.3.0-m06 (Mojarra) und PrimeFaces 6.0.2

+0

Dies funktioniert hervorragend , Danke! Obwohl ich mir definitiv wünschte, es gäbe einen einfacheren Weg. – lucasvw

Verwandte Themen