2012-11-17 10 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