2011-12-21 96 views
4

我有Primesfaces的延遲加載dataTable的一些問題,令人耳目一新。我正在使用3.0.M4。Primefaces的dataTable不刷新內容

有與過濾你的榜樣三個類等。也試圖與遲緩裝載僅但隨後的數據沒有被在所述控制器重新加載的例子。所以我用過濾的第二個例子。在那裏,我得到了控制重載事件(記錄器顯示「加載數據」)。 但表不顯示新數據:-(。爲什麼呢?

如果誰可以幫助嗎?

親切的問候!

LazyCarDataModel

package org.jboss.as.quickstarts.helloworld; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import org.primefaces.model.LazyDataModel; 
import org.primefaces.model.SortOrder; 

/** 
* Dummy implementation of LazyDataModel that uses a list to mimic a real datasource like a database. 
*/ 
public class LazyCarDataModel extends LazyDataModel<Car> { 

    private static final long serialVersionUID = 1L; 

    private List<Car> datasource; 

    public LazyCarDataModel(List<Car> datasource) { 
     this.datasource = datasource; 
    } 

    @Override 
    public Car getRowData(String rowKey) { 
     for(Car car : datasource) { 
      if(car.getModel().equals(rowKey)) 
       return car; 
     } 

     return null; 
    } 

    @Override 
    public Object getRowKey(Car car) { 
     return car.getModel(); 
    } 

    @Override 
    public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { 
     List<Car> data = new ArrayList<Car>(); 

     //filter 
     for(Car car : datasource) { 
      boolean match = true; 

      for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
       try { 
        String filterProperty = it.next(); 
        String filterValue = filters.get(filterProperty); 
        String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car)); 

        if(filterValue == null || fieldValue.startsWith(filterValue)) { 
         match = true; 
        } 
        else { 
         match = false; 
         break; 
        } 
       } catch(Exception e) { 
        match = false; 
       } 
      } 

      if(match) { 
       data.add(car); 
      } 
     } 

     //sort 
     if(sortField != null) { 
      Collections.sort(data, new LazySorter(sortField, sortOrder)); 
     } 

     //rowCount 
     int dataSize = data.size(); 
     this.setRowCount(dataSize); 

     //paginate 
     if(dataSize > pageSize) { 
      try { 
       return data.subList(first, first + pageSize); 
      } 
      catch(IndexOutOfBoundsException e) { 
       return data.subList(first, first + (dataSize % pageSize)); 
      } 
     } 
     else { 
      return data; 
     } 
    } 
} 

LazyTableBean

package org.jboss.as.quickstarts.helloworld; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

import org.primefaces.model.LazyDataModel; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Named 
@SessionScoped 
public class LazyTableBean implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private final static Logger logger = LoggerFactory.getLogger(LazyTableBean.class); 

    private final static String[] colors; 

    private final static String[] manufacturers; 

    private List<Car> cars; 

    static { 
      colors = new String[10]; 
      colors[0] = "Black"; 
      colors[1] = "White"; 
      colors[2] = "Green"; 
      colors[3] = "Red"; 
      colors[4] = "Blue"; 
      colors[5] = "Orange"; 
      colors[6] = "Silver"; 
      colors[7] = "Yellow"; 
      colors[8] = "Brown"; 
      colors[9] = "Maroon"; 

      manufacturers = new String[10]; 
      manufacturers[0] = "Mercedes"; 
      manufacturers[1] = "BMW"; 
      manufacturers[2] = "Volvo"; 
      manufacturers[3] = "Audi"; 
      manufacturers[4] = "Renault"; 
      manufacturers[5] = "Opel"; 
      manufacturers[6] = "Volkswagen"; 
      manufacturers[7] = "Chrysler"; 
      manufacturers[8] = "Ferrari"; 
      manufacturers[9] = "Ford"; 
    } 

    private LazyCarDataModel lazyModel; 

    private Car selectedCar; 

    public LazyTableBean() { 
     cars = new ArrayList<Car>(); 

     populateLazyRandomCars(cars, 100000); 
     lazyModel = new LazyCarDataModel(cars); 

    } 

    public Car getSelectedCar() { 
     return selectedCar; 
    } 

    public void setSelectedCar(Car selectedCar) { 
     this.selectedCar = selectedCar; 
    } 

    public LazyDataModel<Car> getLazyModel() { 
     return lazyModel; 
    } 

    private void populateLazyRandomCars(List<Car> list, int size) { 
     System.out.println("Loading data"); 
     for(int i = 0 ; i < size ; i++) { 
      list.add(new Car(getRandomModel(), getRandomYear(), getRandomManufacturer(), getRandomColor())); 
     } 
    } 

    private String getRandomColor() { 
     return colors[(int) (Math.random() * 10)]; 
    } 

    private String getRandomManufacturer() { 
     return manufacturers[(int) (Math.random() * 10)]; 
    } 

    private int getRandomYear() { 
     return (int) (Math.random() * 50 + 1960); 
    } 

    private String getRandomModel() { 
     return UUID.randomUUID().toString().substring(0, 8); 
    } 

} 

這裏的XHTML:

<?xml version="1.0" encoding="UTF-8"?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui" template="template-default.xhtml"> 

    <ui:define name="content"> 

    <h:form> 

     <p:dataTable var="car" value="#{lazyTableBean.lazyModel}" 
     paginator="true" rows="10" lazy="true" 
     paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 
     rowsPerPageTemplate="5,10,15" 
     selection="#{lazyTableBean.selectedCar}" selectionMode="single"> 
     <p:ajax event="rowSelect" 
      listener="#{lazyTableBean.onRowSelect}" update=":form:display" 
      oncomplete="carDialog.show()" /> 

     <p:column headerText="Model"> 
      <h:outputText value="#{car.model}" /> 
     </p:column> 

     <p:column headerText="Year"> 
      <h:outputText value="#{car.year}" /> 
     </p:column> 

     <p:column headerText="Manufacturer"> 
      <h:outputText value="#{car.manufacturer}" /> 
     </p:column> 

     <p:column headerText="Color"> 
      <h:outputText value="#{car.color}" /> 
     </p:column> 
     </p:dataTable> 

     <p:dialog header="Car Detail" widgetVar="carDialog" 
     resizable="false" width="200" showEffect="explode" 
     hideEffect="explode"> 

     <h:panelGrid id="display" columns="2" cellpadding="4"> 

      <f:facet name="header"> 
      <p:graphicImage 
       value="/images/cars/#{lazyTableBean.selectedCar.manufacturer}.jpg" /> 
      </f:facet> 

      <h:outputText value="Model:" /> 
      <h:outputText value="#{lazyTableBean.selectedCar.model}" /> 

      <h:outputText value="Year:" /> 
      <h:outputText value="#{lazyTableBean.selectedCar.year}" /> 

      <h:outputText value="Manufacturer:" /> 
      <h:outputText 
      value="#{lazyTableBean.selectedCar.manufacturer}" /> 

      <h:outputText value="Color:" /> 
      <h:outputText value="#{lazyTableBean.selectedCar.color}" /> 
     </h:panelGrid> 
     </p:dialog> 
    </h:form> 
    </ui:define> 
</ui:composition> 

回答

1

好的。我擁有它。感謝您的想法!這給我帶來了另一個想法。即使exmaples在p:dataTable標籤上沒有id屬性,我現在就設置它,表格按預期工作。 所以a

<p:dataTable id="dataTable" var="car"... 

幫助;-)。

3

試試這個:
1.給你<h:form>的ID。 (<h:form id="tableForm">
2.更改從<p:ajax>至(update=":tableForm")更新屬性而不:顯示

如果這是行不通的。試試這個:
1.更改@Named詮釋@ManagedBean 2.更改@SessionScoped使用javax.faces.bean.SessionScoped

這只是一些想法。試試:)