Primefaces dataTable不刷新内容

时间:2011-12-21 16:47:47

标签: datatable primefaces loading lazy-evaluation

我在延迟加载的Primesfaces数据表上有一些问题。我正在使用3.0.M4。

在您的示例中使用过滤器有三个类。尝试仅使用延迟加载的示例,但随后数据未在控制器中重新加载。所以我用过滤的第二个例子。我在控制器中获得重载事件(记录器显示“正在加载数据”)。 但该表未显示新数据:-(。为什么?

有谁可以在这里提供帮助?

亲切的问候!

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>

2 个答案:

答案 0 :(得分:3)

试试这个:
1.给你<h:form>一个id。 (<h:form id="tableForm">
2.将更新属性从<p:ajax>更改为(update=":tableForm"),而不显示:display

如果这不起作用。试试这个:
1.将@Named注释更改为@ManagedBean 2.将@SessionScoped更改为使用 javax.faces.bean.SessionScoped

这只是一些想法。试试吧:))

答案 1 :(得分:1)

确定。我有它。谢谢你的想法!这让我有了另一个想法。即使exmaples在p:dataTable标记上没有id属性,我现在设置它并且表按预期工作。 所以

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

帮助; - )。