Связывание подтаблицы внутри таблицы данных с помощью JSF

Мой продукт использует JSF с Primefaces 2.2. Мне нужно обработать вспомогательную таблицу данных внутри другой таблицы данных. Код приведен ниже.

<h:form>
<p:dataTable id="myInvoiceTable"
    value="#{globalBean.invoices}" var="invoice">

    <p:column>
      <f:facet name="header">
        <h:outputText value="Bill ID" />
      </f:facet>
      <h:outputText value="#{invoice.billId}" />
    </p:column>

    <p:column>
      <f:facet name="header">
        <h:outputText value="Item" />
      </f:facet>
      <h:outputText value="#{invoice.item}" />
    </p:column>

    <p:rowExpansion>

      <h:selectOneMenu id="reasons" value="#{invoiceAction.reason}">
         <f:selectItem itemLabel="Reason 1" itemValue="Reason 1"></f:selectItem>
         <f:selectItem itemLabel="Reason 2" itemValue="Reason 2"></f:selectItem>
      </h:selectOneMenu>

      <p:inputText id="activity_amount" value="#{invoiceAction.activity_amount}"/>

      <p:commandButton value="PROCESS" action="invoice_process" update="actions_table">
      </p:commandButton>

      <p:dataTable id="actions_table" value="#{invoice.actions}" var="invAction">

         <p:column>
            <h:outputText value="#{invAction.reason}" />
         </p:column>

         <p:column>             
            <h:outputText value="#{invAction.activity_amount}" />
         </p:column>

      </p:dataTable>

    </p:rowExpansion>

</p:dataTable>

Here's my bean.

public class Invoice {
    private int billId;
    private String item;
    private List<InvoiceAction> actions;

    // Getter & setter here
}

public class InvoiceAction {
    private String reason;
    private double activity_amount;
    private int billId;

    // Getter & setter here;
}

Но когда создается HTML, он не обрабатывается должным образом. Только меню выбора в последней строке таблицы данных может получать данные, выбранные пользователем, другие не могут. Поскольку все меню выбора во всех строках используют один и тот же объект (#{invoiceAction}), а компонент просто получает значение последнего компонента на странице. Я знал основную причину, но я не знаю, как ее решить. Как позволить им отправлять в указанной строке?


person anhthuy    schedule 03.01.2012    source источник


Ответы (1)


Прежде всего, я думаю, что ваши классы Invoice и InvoiceAction выглядят как обычные объекты Java. Я чувствую, что они не должны быть Managed Bean.

Кроме того, вы правы в том, что ваше #{invoiceAction} неправильно привязано к одному из действий в List<InvoiceAction> actions. Поскольку вы используете вложенные <p:dataTable>, я думаю, вы можете воспользоваться преимуществом <p:cellEditor>. Это будет что-то вроде этого:

<p:rowExpansion>
   <p:dataTable id="actions_table" value="#{invoice.actions}" var="invAction">

      <p:column>
         <p:cellEditor>  
            <f:facet name="output">  
               <h:outputText value="#{invAction.reason}" />   
            </f:facet>  
            <f:facet name="input">  
               <h:selectOneMenu id="reasons" value="#{invoiceAction.reason}">
                  <f:selectItem itemLabel="Reason 1" itemValue="Reason 1" />
                  <f:selectItem itemLabel="Reason 2" itemValue="Reason 2" />
               </h:selectOneMenu>
            </f:facet>  
         </p:cellEditor>
      </p:column>

      <p:column>
         <p:cellEditor>  
            <f:facet name="output">  
               <h:outputText value="#{invAction.activity_amount}" />   
            </f:facet>  
            <f:facet name="input">  
               <p:inputText id="activity_amount" value="#{invoiceAction.activity_amount}" />
            </f:facet>  
         </p:cellEditor>
      </p:column>

   </p:dataTable>

   <p:commandButton value="PROCESS" action="invoice_process" update="actions_table" />
</p:rowExpansion>
person Mr.J4mes    schedule 03.01.2012