XHTML方面:
<p:dataTable id="selectProductTable" var="product" value="#{manageFormsView.productModel}" selection="#{manageFormsView.product}" >
豆方:
private SelectableDataModel<Product> productModel=new SelectableDataModel<Product>() {
@Override
public Product getRowData(String rowKey) {
//In a real app, a more efficient way like a query by rowKey should be implemented to deal with huge data
for(Product product : productList) {
if(product.getModel().equals(rowKey))
return product;
}
return null;
}
@Override
public Object getRowKey(Product p) {
return p.getModel();
}
};
我不想生成一个实现SDM的新类,我不能像上面那样进行内联实现吗?
我得到例外:
javax.faces.FacesException: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled.
答案 0 :(得分:8)
异常消息具有误导性。仅实现SelectableDataModel
接口是不够的。您还需要扩展 DataModel
实施,例如ListDataModel
。这无法在匿名类的风格中完成。你真的需要创建另一个类。
public class ProductDataModel extends ListDataModel<Product> implements SelectableDataModel<Product> {
// ...
}
如果您有共同的基本权利(使用getId()
等),您可以根据需要进行统一,这样您就不需要为每个实体创建另一个。
public class BaseEntityDataModel<E extends BaseEntity> extends ListDataModel<E> implements SelectableDataModel<E> {
// ...
}
作为完全不同的替代方案,您还可以使用rowKey
的{{1}}属性,并让它与<p:dataTable>
完全相同。这样您就不再需要整个SelectableDataModel#getRowKey()
接口了。
SelectableDataModel
答案 1 :(得分:6)
由于您似乎没有getRowData
和getRowKey
的任何特殊功能,我认为您不需要做这些复杂的事情。 <p:dataTable>
具有selection
和rowKey
属性的单一选择模式,可以充分发挥作用。你的桌子应该是这样的:
<p:dataTable var="p" value="#{mrBean.products}" rowKey="#{p.model}"
selection="#{mrBean.selectedProduct}" selectionMode="single">
... // Your columns
</p:dataTable>
您可以在selectedProduct
的{{1}}属性中获取所选行,如下所示:
ManagedBean