我正在使用多行选择以使用户能够删除选择记录。根据 PDF 文档和 ShowCase Labs,我必须像这样使用翻译成 Java 的代码:
final DataTable = new DataTable();
...
// (1)
dataTable.setSelectionMode("multiple");
// (2)
dataTable.setValueExpression("selection", createValueExpression(DbeBean.class, "selection", Object[].class));
// (3)
dataTable.setValueExpression("rowKey", createValueExpression("#{" + VARIABLE + ".indexKey}", Object.class));
...
final ClientBehaviorHolder dataTableAsHolder = dataTable;
...
// (4)
dataTableAsHolder.addClientBehavior("rowSelect", createAjaxBehavior(createMethodExpression(metaData.controllerBeanType, "onRowSelect", void.class, new Class<?>[] {SelectEvent.class})));
- 多重 - 这条线具有多重选择,在前端视觉效果很好。
- selection - 被调用时,#{dbeBean.selection} 确实被绑定并且
public void setSelection(T[] selection)
仅被调用。 - rowKey - 被调用,工作正常,
getIndexKey()
被调用并返回必要的结果。 - rowSelect - 此事件处理程序也被调用,
DbeBean.onRowSelect(SelectEvent e)
.
我也使用惰性数据模型(我真的不相信这可能是原因,但谁知道呢?顺便说一句,它返回List<T>
虽然 setSelection() 需要T[]
- 为什么会这样?):
public abstract class AbstractLazyDataSource<T extends IIndexable<K>, K> extends LazyDataModel<T> {
...
@Override
public final List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
...
final IResultContainer<T> resultContainer = getData(querySpecifier);
final List<T> data = resultContainer.getData();
setRowCount(resultContainer.getTotalEntitiesCount());
return getPage(data, first, pageSize);
}
...
@Override
public final K getRowKey(T object) {
return object.getIndexKey(); // T instanceof IIndexable<K>, have to return a unique ID
}
...
但是,处理程序不会像预期的那样工作。请帮助我理解为什么 (2) DbeBean.setSelection(T[] selection)
& (4)分别DbeBean.onRowSelect(SelectEvent e)
只得到空值:T[] selection = null
和SelectEvent: e.getObject = null
。我究竟做错了什么?
提前致谢。
- PrimeFaces 3.2
- 莫哈拉 2.1.7