【问题标题】:Row selection not working in primefaces (5.3) data table when the lazy loading is implemented, but it works without lazy loading实施延迟加载时,行选择在 primefaces (5.3) 数据表中不起作用,但它在没有延迟加载的情况下工作
【发布时间】:2016-01-29 16:14:40
【问题描述】:

这是我的数据表:

<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;
        }
    }
}

控制器还有一个 items 列表 (java.util.List ) 如果我将此列表用作数据列表的数据,则行选择工作没有任何问题,看来问题是延迟加载,但我不知道为什么会这样。

顺便说一句,非常感谢有人可以给我的所有提示和帮助。

【问题讨论】:

  • 我没有看到任何关于 onRowSelect 的信息。您应该仔细查看 primfaces 展示柜以了解延迟加载。
  • 这就是我在 primefaces 展示案例中创建延迟加载的问题:primefaces.org/showcase/ui/data/datatable/lazy.xhtml,但找不到错误在哪里。
  • 就像我说的,我在您的代码中没有看到任何关于 onRowSelect 的内容。如果行选择不起作用,也许您需要onRowSelect。调查一下是我最好的建议。
  • 我刚刚在控制器的帖子中添加了方法,创建问题时忘记了。
  • 好吧,如果还是不行,我也无能为力了。我无法编译您的代码,因为它不完整。我有信心,如果我测试展示代码,它会正常工作,所以我无法调试你的代码。首先,因为您的示例不完整,其次,主要是因为这不是这个论坛的目的。

标签: jsf primefaces lazy-loading


【解决方案1】:

最后我解决了这个问题,问题是 LazyDataModel 实现中的逻辑错误,特别是在“getRowData(String rowKey)”方法中。 在评论 “Error here” 中,问题是在 primefaces 展示中,该示例使用 equals() 方法进行比较,我的问题是我试图比较一个整数(的 id my 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;
        }
    }
}

【讨论】:

  • 最好添加完整的解决方案。这也是在所有数据表或每个不同的数据表中进行延迟加载的常用方法,您必须创建一个类
  • 我在 primefaces 数据表延迟加载中遇到了一个问题,您能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多