我正在开发一个用JSF和PrimeFaces添加/编辑产品价格的表单。单个产品可以有多种价格,具体取决于<p:dataTable>
中显示的数量。
支持bean:
@ManagedBean
@ViewScoped
public class ProductBean {
protected Product product;
protected List<ProductPrice> productPrices;
public void addNewPrice() {
ProductPrice productPrice = new ProductPrice();
productPrice.setPrice(new BigDecimal(0));
this.productPrices.add(productPrice);
}
// ...
}
Facelet页面:
<h:form id="productForm">
<p:inputText value="#{productBean.product.name}" required="true">
<f:ajax event="blur" render="nameMessage" />
</p:inputText>
<p:message id="nameMessage" for="name" />
<p:dataTable id="pricesList" ...>
</p:dataTable>
<p:commandButton value="Add another price" update="pricesList" action="#{productBean.addNewPrice()}" />
<p:commandButton value="Submit" action="#{productBean.submit}" />
</h:form>
第一个按钮&#34;添加另一个价格&#34;它应该做什么:在&#34; pricesList&#34;中添加一个新行。但仅当表单有效时(表单无效,如果未设置product-name)。
我的问题是,我有两个commandButtons用于表单,但我不知道如何在没有commandButton的情况下获得我希望的功能。我尝试了很多方法:更改&#34;添加另一个价格&#34;到具有ajax功能的标准<p:button>
;由于按钮不起作用而无法正常工作。结果。我试过&#34; type = button&#34;对于这个按钮,但在这种情况下根本没有任何反应。
有什么建议要实现我希望的功能吗?没有必要使用按钮来解决我的问题。
答案 0 :(得分:7)
<p:commandButton>
默认提交并处理整个表单。这确实会验证所有输入字段。您可以使用process
属性来控制此属性,因此默认为@form
。在您的特定情况下,您可以使用@this
,以便仅调用命令按钮自己的操作。
<p:commandButton value="Add another price" process="@this" update="pricesList" action="#{productBean.addNewPrice()}" />
答案 1 :(得分:0)
使用 p:commandButton 动态添加行有什么问题? 如果我正确地理解您的问题,您显然需要向托管bean发出请求,以便将新行信息添加到数据表列表中。如果您对 p:commandButton 不满意,可以随时选择 p:commandLink 。对于编辑行数据,您可以将 p:rowEditor 与 p:datatable 一起使用。
check out the showcase example for datatable row editing
希望这有助于:)