2012-01-03 16 views
0

私の製品では、Primeface 2.2でJSFを使用しています。私が必要とするのは、別のデータテーブル内のサブデータテーブルを処理することです。コードは以下の通りです。 JSFでデータテーブル内にサブテーブルをバインドする

<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> 

は、ここに私の豆です。

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})を使用しているため、Beanはページ内の最後のコンポーネントの値を取得します。私は根本的な原因を知っていたが、私はそれを解決する方法を知らない。彼らは指定された行に提出する方法?

答えて

1

まず、InvoiceInvoiceActionのクラスは通常のJavaオブジェクトと同じように見えます。私は彼らがマネージドビーンであってはならないと感じています。

さらに、#{invoiceAction}List<InvoiceAction> actionsの操作の1つに正しくバインドされていないことは間違いありません。 <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> 
関連する問題