2012-11-17 11 views
3

我正嘗試使用'panelGrid'中的表單來呈現dataTable中的值使用<f:ajax>。但是,使用<h:commandButton>提交時,發送的值不會顯示在dataTable中。我沒有在瀏覽器中獲得堆棧或任何控制檯錯誤。JSF PrimeFaces/Ajax渲染爲Datable無法將項目添加到列表中

這是我的XHTML(簡體):

產品目錄:

<p:tabView id="tabView" style="width: 65%" > 
      <p:tab id="books" title="Books"> 
       <p:dataGrid var="book" value="#{saleBean.productList}" columns="3" 
          rows="9" paginator="true" paginatorTemplate="{CurrentPageReport} 
          {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} 
          {LastPageLink} {RowsPerPageDropdown}" 
          rowsPerPageTemplate="3,6,9"> 
        <h:form id="product" > 
        <p:panel header="#{book.name}" style="text-align: center"> 


          <h:panelGrid columns="1" style="width: 65%"> 

           <!-- Add Book Images here --> 
           <h:outputText value="#{book.price}"/> 

           <h:outputLabel value="Dct (in dollars): " /> 
           <h:inputText id="discount" value="#{saleBean.item.unit_discount}" style="width: 50%" /> 

           <p:commandButton value="Add to Cart" update=":dataTableForm:sc" 
               action="#{saleBean.doAddItem}"/> 


          </h:panelGrid> 


        </p:panel> 
        </h:form>   
       </p:dataGrid> 
      </p:tab> 

      <p:tab id="arts" title="Art/Various"> 
       <!-- Art Products to be added here --> 
      </p:tab> 

      <p:tab id="other" title="Other"> 
       <!-- Various Products to be Added here --> 
      </p:tab> 

    </p:tabView> 


    <hr/>   
    <h1>Shopping Cart</h1> 
    <hr/> 

    <h:form id="dataTableForm"> 
    <p:dataTable id="sc" value="#{saleBean.sd}" var="item" style="width: 60%"> 

     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="Product"/> 
      </f:facet> 
      <h:outputText value="#{item.product_fk}"/> 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="Quantity"/> 
      </f:facet> 
      <h:outputText value="#{item.quantity}"/> 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="Unit Price"/> 
      </f:facet> 
      <h:outputText value="#{item.unit_Cost}"/> 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="Unit Discount"/> 
      </f:facet> 
      <h:outputText value="#{item.unit_discount}"/> 
     </p:column> 

    </p:dataTable> 
    </h:form> 

</h:body> 

這豆(簡體):

public String doAddItem() 
    { 
     item.setUnit_Cost(product.getPrice());   
     item.setProduct_fk(product); 
     item.setQuantity(1); 
     sd.add(item); 

     return "productCatalog"; 
    } 
+0

有你試圖從h:commandButt中移動你的動作在f:ajax中的監聽器? –

+0

@AlexandreLavoie非常感謝你。我已經實現了建議的更改,但是我得到''com.lv.Controllers.SaleBean'類沒有'doAddItem'屬性。'我有'doAddItem'。他們是否有其他建議?提前致謝。 – lv10

+0

您將需要更改AjaxBehaviorEvent的ActionEvent。 –

回答

0

儘量只使用PF組件時,你可以例如p:datatable。用p:commandButton替換按鈕,並使用進程和更新來代替f:ajax。

也可能會更好地在表單中包含p:datatable。

+0

Spyros,非常感謝。我已經改變了一切primeFaces,但是,改變它後,我面臨一個不同的問題,它給了我一個'無法找到組件標識符「sc」引用「tabView:j_idt8:0:product:addToCart」.'堆棧。信息應該更新的表的名稱是'sc'。我已經在原文中更新了我的代碼以反映這些更改。如果您有任何建議,請告訴我。提前致謝。 – lv10

+0

您的表格未包裹在h:表格組件中。嘗試將其包裝在相同的h:表格中,即h:form id =「product」。如果這個工作,你不希望一切都在相同的形式,然後使用另一種形式,例如h:form id =「datatableForm」,並引用爲render =「:datatableForm:sc」 –

+0

我設法刪除不能發現組件錯誤。但是,在嘗試了您的建議之後,我仍然無法獲得按鈕。我已經更新了上面的代碼。讓我知道你是否有任何建議來解決這個問題。提前致謝。 – lv10

1

根據PrimeFaces文檔:

http://www.primefaces.org/docs/vdl/3.4/primefaces-p/commandButton.html

actionListener="#{saleBean.doAddItem}"必須使用對應於一個功能:

public void doAddItem(ActionListener event) 
{ 
    // do your stuff 
} 

在這裏使用的動作是一個例子:

action="#{saleBean.doAddItem}" 

public String doAddItem(void) 
{ 

    item.setUnit_Cost(product.getPrice());   
    item.setProduct_fk(product); 
    item.setQuantity(1); 
    sd.add(item); 

    return "productCatalog"; 
} 
+0

亞歷山大再次感謝。我已經使用了ActionListener建議,但仍然按下按鈕後沒有任何反應。我已經更新了我的代碼,以反映這些變化。提前致謝。 – lv10

+0

使用上面的第二個示例。不知道你需要行動! –

+0

感謝亞歷山大,我已經使用行動更新了代碼。但是,按下按鈕後表格仍未更新。我無法使用'(void)',因爲它需要使用''並返回一個異常。所以,對於我所使用的'doAddItem'方法,如你所建議的,但沒有'(void)'。有沒有我提供的其他代碼可以幫助您更好地瞭解情況? – lv10