如何动态地向p:dataTable添加新行而不验证表单?

时间:2012-09-24 19:41:10

标签: forms jsf primefaces

我正在开发一个用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;对于这个按钮,但在这种情况下根本没有任何反应。

有什么建议要实现我希望的功能吗?没有必要使用按钮来解决我的问题。

2 个答案:

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

希望这有助于:)