2016-01-29 1 views
1

Это мои данные таблицы:выбор строки не работает в primefaces (5,3) таблицы данных, когда реализуется ленивая загрузка, но работает без отложенной загрузки

<h:form id="eventListForm"> 
       <p:contextMenu id="eventDataTableContextMenu" for="datalist"> 
       <p:menuitem value="#{myBundle.Create}" onclick="document.getElementById('eventListForm:createButton').click();" icon="ui-icon-plus"/> 
       <p:menuitem value="#{myBundle.View}" onclick="document.getElementById('eventListForm:viewButton').click();" icon="ui-icon-search"/> 
       <p:menuitem value="#{myBundle.Edit}" onclick="document.getElementById('eventListForm:editButton').click();" icon="ui-icon-pencil"/> 
       <p:menuitem value="#{myBundle.Delete}" onclick="document.getElementById('eventListForm:deleteButton').click();" icon="ui-icon-trash"/> 
      </p:contextMenu> 
      <p:dataTable id="datalist" 
         value="#{eventController.lazyModel}" 
         var="item" 
         rowKey="#{item.eventId}" 
         paginator="true" 
         paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" 
         rows="10" 
         rowsPerPageTemplate="10,20,30,40,50" 
         selectionMode="single" 
         selection="#{eventController.selected}" 
         lazy="true"> 

       <p:ajax event="rowSelect" update="@form:createButton,@form:viewButton,@form:editButton,@form:deleteButton,@form:eventDataTableContextMenu"/> 
       <p:ajax event="rowUnselect" update="@form:createButton,@form:viewButton,@form:editButton,@form:deleteButton,@form:eventDataTableContextMenu"/> 
       <p:ajax event="contextMenu" update="@form:createButton @form:viewButton @form:editButton @form:deleteButton"/> 
       <p:ajax event="rowDblselect" onsuccess="document.getElementById('eventListForm:viewButton').click();"/> 

Это контроллер:

public class EventController { 

     IEventService eventService; 
     List<EventDTO> items; 
     private EventDTO selected; 
     private Integer priorityIdSelected; 

     private LazyDataModel<EventDTO> lazyModel; 

     public void init() { 
      //items = eventService.getAll(); 
      lazyModel = new EventLazyLoader(eventService); 
     } 


public void onRowSelect(SelectEvent event) { 
    FacesMessage msg = new FacesMessage("Event Selected", ((EventDTO) event.getObject()).getEventId().toString()); 
    FacesContext.getCurrentInstance().addMessage(null, msg); 
} 

Это ленивая реализация загрузчика:

public class EventLazyLoader extends LazyDataModel<EventDTO> { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private List<EventDTO> datasource; 

    public EventLazyLoader(IEventService eventServiceImpl) { 
     this.datasource = eventServiceImpl.getAll(); 
    } 

    @Override 
    public EventDTO getRowData(String rowKey) { 
     for(EventDTO event : datasource) { 
      if(event.getEventId().equals(rowKey)) 
       return event; 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(EventDTO event) { 
     return event.getEventId(); 
    } 

    @Override 
    public List<EventDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) { 
     List<EventDTO> data = new ArrayList<EventDTO>(); 
      //filter 
     for(EventDTO event : datasource) { 
      boolean match = true; 
      if (filters != null) { 
       for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
        try { 
         String filterProperty = it.next(); 
         Object filterValue = filters.get(filterProperty); 
         String fieldValue = String.valueOf(event.getClass().getField(filterProperty).get(event)); 
         if(filterValue == null || fieldValue.startsWith(filterValue.toString())) { 
          match = true; 
         } else { 
          match = false; 
          break; 
         } 
        } catch(Exception ex) { 
         match = false; 
        } 
       } 
      } 
      if(match) { 
       data.add(event); 
      } 
     } 

     //sort 
     if(sortField != null) { 
      Collections.sort(data, new EventLazySorter(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; 
     } 
    } 
} 

Контроллер также имеют элементы List (java.util.List), если я использую этот список в качестве данных для данных списка выбора строк работает без каких-либо проблем, то кажется, что проблема ленивых но я не знаю, почему это происходит.

Кстати, спасибо за советы и помощь, которые кто-то может мне дать.

+0

Я не вижу ничего о 'onRowSelect' вы должны просмотреть витрина 'primfaces' для ленивой загрузки. –

+0

То, что я создал, ленивая загрузка, как и в случае с изображением в виде шрифтов: http://primefaces.org/showcase/ui/data/datatable/lazy.xhtml, но не может найти, где ошибка. –

+0

Как я уже сказал, я ничего не вижу в вашем коде о 'onRowSelect'. Если выбор строки не работает, возможно, вам нужен 'onRowSelect'. Взгляд в это - мое лучшее предложение. –

ответ

1

Наконец-то я решил эту проблему. Проблема была логической ошибкой в ​​реализации LazyDataModel, особенно в методе getRowData (String rowKey). В комментарии «Ошибка здесь» проблема заключалась в том, что в витрине штриховок пример использует метод equals() для сравнения, моя проблема заключалась в том, что я попытался сравнить для равенства один Integer (id моего dto) с строковое значение получается из выбора строки, поэтому я анализирую эту строку и, наконец, сравнить целые значения (глупую ошибку, если вы об этом думаете)

public class EventLazyLoader extends LazyDataModel<EventDTO> { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

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

    private List<EventDTO> datasource; 

    public EventLazyLoader(IEventService eventServiceImpl) { 
     this.datasource = eventServiceImpl.getAll(); 
    } 

    @Override 
    public EventDTO getRowData(String rowKey) { 
     int intRowKey = Integer.parseInt(rowKey); 
     for(EventDTO event : datasource) { 
      if(event.getEventId() == intRowKey) {//Error here 
       return event; 
      } 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(EventDTO event) { 
     return event.getEventId(); 
    } 

    @Override 
    public List<EventDTO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,Object> filters) { 
     List<EventDTO> data = new ArrayList<EventDTO>(); 
      //filter 
     for(EventDTO event : datasource) { 
      boolean match = true; 
      if (filters != null) { 
       for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
        try { 
         String filterProperty = it.next(); 
         Object filterValue = filters.get(filterProperty); 
         String fieldValue = String.valueOf(event.getClass().getField(filterProperty).get(event)); 
         if(filterValue == null || fieldValue.startsWith(filterValue.toString())) { 
          match = true; 
         } else { 
          match = false; 
          break; 
         } 
        } catch(Exception ex) { 
         match = false; 
        } 
       } 
      } 
      if(match) { 
       data.add(event); 
      } 
     } 

     //sort 
     if(sortField != null) { 
      Collections.sort(data, new EventLazySorter(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; 
     } 
    } 
} 
+0

Лучше добавьте полное решение. Также это общий подход для LazyLoading во всех данных или для каждого другого типа данных, который вы должны сделать классом –

 Смежные вопросы

  • Нет связанных вопросов^_^