【发布时间】: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