2012-01-03 4 views
0

내 제품은 Primefaces 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})를 사용하고 있기 때문에 빈은 페이지의 마지막 구성 요소 값을 가져옵니다. 근본 원인을 알고 있었지만 해결 방법을 모르겠습니다. 지정된 행에 제출하는 방법

답변

1

우선 InvoiceInvoiceAction 클래스는 일반적인 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> 
관련 문제