Primefaces dataTable не обновляет содержимое - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть некоторые проблемы с обновлением на лениво загруженной таблице данных 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 ]

3 голосов
/ 22 декабря 2011

Попробуйте это: 1. Дайте свой <h:form> идентификатор.(<h:form id="tableForm">)2. Измените атрибут обновления с <p:ajax> на (update=":tableForm") без: display

Если это не работает.Попробуйте это: 1. Измените @Named Аннотация на @ManagedBean 2. Измените @SessionScoped на javax.faces.bean.SessionScopedЭто всего лишь некоторые идеи.Попробуй:)

1 голос
/ 22 декабря 2011

Хорошо.У меня есть это.Спасибо за ваши идеи!Это навело меня на другую идею.Даже у exmaples нет атрибута id в теге p: dataTable, я установил это сейчас, и таблица работает, как и ожидалось.Так что

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

помогло; -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...