0

我正在使用多行选择以使用户能够删除选择记录。根据 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})));
  1. 多重 - 这条线具有多重选择,在前端视觉效果很好。
  2. selection - 被调用时,#{dbeBean.selection} 确实被绑定并且public void setSelection(T[] selection)仅被调用。
  3. rowKey - 被调用,工作正常,getIndexKey()被调用并返回必要的结果。
  4. 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 = nullSelectEvent: e.getObject = null。我究竟做错了什么?

提前致谢。

  • PrimeFaces 3.2
  • 莫哈拉 2.1.7
4

1 回答 1

1

我已经开始工作了:我只是rowKey在动态创建(DataTable)期间删除了该属性,并在惰性数据模型中p:dataTable简单地重载。getRowData现在它起作用了。

于 2012-08-01T10:46:19.333 回答