2011-12-21 2 views
4

게으른로드 된 DataTable of Primesfaces에서 새로 고침하는 데 문제가 있습니다. 3.0.M4를 사용하고 있습니다.Primeface 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

확인. 나는 가지고있다. 당신의 아이디어에 감사드립니다! 이것은 또 다른 생각을 갖게했다. 예를 들어 ex : p : dataTable 태그에 id 특성이 없어도이 값을 설정하면 테이블이 예상대로 작동합니다. 그래서 a

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

도움 ;-).

3

이 시도 :
1. 당신의 <h:form> ID를 부여합니다. 없이 (<h:form id="tableForm">)
2. 변경 (update=":tableForm")에 <p:ajax>에서 업데이트 속성 : 화면이 만약

가 작동하지 않습니다. 이 시도 :
1. 변경 @Named 주석을 @ManagedBean 2. 변경 @SessionScopedjavax.faces.bean.SessionScoped

이 단지 몇 가지 아이디어입니다 사용할 수 있습니다. 사용해보기 :

관련 문제