Простые данные DataTable с SubTable и множественным выбором - PullRequest
4 голосов
/ 17 февраля 2012

Я бы хотел, чтобы таблица заказов была сгруппирована по клиентам. Из этой таблицы пользователь сможет выбрать несколько бронирований для выставления счетов. Поэтому я пытаюсь использовать SubTable для группировки, однако я не уверен, как реализовать функциональность выбора. Очевидно, подтаблица не допускает атрибут выбора, и если я устанавливаю атрибут выбора для родительского объекта DataTable, я не знаю, как выбрать rowKey.

Это моя попытка:

<p:dataTable style="border: 0px;" value='#{clientController.allClients}'
             var='client' rowKey="#{item.id}"  selectionMode="multiple"
             selection="#{bookingController.bookingsToBill}">
  <p:subTable value='#{client.billableBookings}' var='item'>
    <f:facet name="header"> 
        <h:outputText style="font-weight:bold;" value="#{client.name}" />
    </f:facet>
    <p:column>
        <f:facet name="header">
            <h:outputText value="Booking"/>
        </f:facet>
        <h:outputText value="#{item.title}"/>
    </p:column>
  </p:subTable>
</p:dataTable>

Хорошо, это приводит к следующей ошибке при отправке выбора:

java.lang.NullPointerException
   java.lang.reflect.Array.newArray(Native Method)
   java.lang.reflect.Array.newInstance(Array.java:52)
   org.primefaces.component.datatable.DataHelper.decodeMultipleSelection(DataHelper.java:238)
   org.primefaces.component.datatable.DataHelper.decodeSelection(DataHelper.java:224)
   org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:64)
   javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
   javax.faces.component.UIData.processDecodes(UIData.java:1162)
   org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:531)
   javax.faces.component.UIForm.processDecodes(UIForm.java:225)
   javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
   javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
   javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933)
   com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
   com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
   com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
   javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)

Поддерживается ли множественный выбор для DataTables с SubTables? Если так, как это сделать правильно? Если нет, то каким способом вы бы предложили достичь аналогичного результата?

Я использую: Primefaces 3.1.1 - Mojarra JSF 2.1 - Tomcat 6.0.14

1 Ответ

1 голос
/ 02 апреля 2012

Вы проанализировали это решение , описанное в витрине Primefaces?

В основном это сводится к следующему:

<p:dataTable style="border: 0px;" value='#{clientController.allClients}' 
             var='client' rowKey="#{item.id}" 
             selection="#{bookingController.bookingsToBill}" >
<p:subTable value='#{client.billableBookings}' var='item'>
    <f:facet name="header"> 
        <h:outputText style="font-weight:bold;" value="#{client.name}" />
    </f:facet>
    <p:column selectionMode="multiple" />
    <p:column>
        <f:facet name="header">
            <h:outputText value="Booking"/>
        </f:facet>
        <h:outputText value="#{item.title}"/>
    </p:column>
</p:subTable>

Или попробуйте с ajaxСлушатель событий, связанный с вашим BookingController:

<p:ajax event="rowSelect" listener="#{bookingController.rowSelected}" />
<p:ajax event="rowUnselect" listener="#{bookingController.rowUnselected}" />

И вы обновляете свой собственный список выбранных элементов в этих двух функциях:

List<Booking> selectedBookings = new ArrayList<>();
...
public void rowSelected(SelectEvent event) {
    Booking book = (Booking) event.getObject();
    selectedBookings.add(book);
}

public void rowUnselected(UnselectEvent event) {
    Booking book = (Booking) event.getObject();
    selectedBookings.remove(book);
}

Это не очень элегантно, но это принесло мою логикуработать после получения этого довольно непонятного исключения NullPointerException.

...