Реализация SelectableDataModel - PullRequest
2 голосов
/ 12 января 2012

Сторона 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 ]

8 голосов
/ 12 января 2012

Сообщение об исключении вводит в заблуждение. Реализация только интерфейса 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 атрибут <p:dataTable> и позволить ему ссылаться точно на то же значение, что и SelectableDataModel#getRowKey(). Таким образом, вам больше не нужен весь интерфейс SelectableDataModel.

<p:dataTable ... rowKey="#{product.model}">

Смотри также:

6 голосов
/ 12 января 2012

Поскольку у вас, кажется, нет специальных функций для 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 вашего ManagedBean следующим образом:

@ManagedBean
@ViewScoped
public class MrBean {
   private List<Product> products;
   private Product       selectedProduct;

   // Getters and Setters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...