实现SelectableDataModel

时间:2012-01-12 11:22:21

标签: jsf primefaces

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.

2 个答案:

答案 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)

由于您似乎没有getRowDatagetRowKey的任何特殊功能,我认为您不需要做这些复杂的事情。 <p:dataTable>具有selectionrowKey属性的单一选择模式,可以充分发挥作用。你的桌子应该是这样的:

<p:dataTable var="p" value="#{mrBean.products}" rowKey="#{p.model}"
             selection="#{mrBean.selectedProduct}"  selectionMode="single">
   ... // Your columns
</p:dataTable>

您可以在selectedProduct的{​​{1}}属性中获取所选行,如下所示:

ManagedBean