Forms 如何在不验证表单的情况下向p:dataTable动态添加新行?

Forms 如何在不验证表单的情况下向p:dataTable动态添加新行?,forms,jsf,primefaces,Forms,Jsf,Primefaces,我正在开发一个表单,用于使用JSF和PrimeFaces添加/编辑产品价格。单个产品可以有多个价格,具体取决于中显示的数量 支持bean: @ManagedBean @ViewScoped public class ProductBean { protected Product product; protected List<ProductPrice> productPrices; public void addNewPrice() { ProductPric

我正在开发一个表单,用于使用JSF和PrimeFaces添加/编辑产品价格。单个产品可以有多个价格,具体取决于
中显示的数量

支持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);
  }

  // ...
}
@ManagedBean
@视域
公共类ProductBean{
受保护产品;
受保护的产品清单价格;
public void addNewPrice(){
ProductPrice ProductPrice=新产品价格();
productPrice.setPrice(新的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>

第一个按钮“添加另一个价格”完成了它应该做的事情:在“价格列表”中添加一个新行。但仅当表单有效时(如果未设置产品名称,则表单无效)

我的问题是,我的表单有两个commandButton,但是如果没有commandButton,我不知道如何获得我想要的功能性。我尝试了很多方法:使用ajax功能将“添加另一个价格”更改为标准的
;因为按钮的结果而不起作用。我尝试了这个按钮的“type=button”,但在这种情况下什么都没有发生


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

使用p:commandButton动态添加行有什么问题? 如果我正确理解了您的问题,那么您显然需要向托管bean发出请求,以便将新行信息添加到datatable列表中。如果您对p:commandButton不满意,您可以选择p:commandLink。对于编辑行数据,您可以使用p:rowdeditorp:datatable

希望这有帮助:)

默认情况下,
提交并处理整个表单。这确实会验证所有输入字段。您可以使用
进程
属性进行控制,该属性默认为
@form
。在您的特定情况下,您可以使用
@this
,以便只调用命令按钮自己的操作

<p:commandButton value="Add another price" process="@this" update="pricesList" action="#{productBean.addNewPrice()}" />


这两个命令按钮本身不是问题所在。我的问题是,第一个按钮应该只向dataTable添加新行并刷新视图id,它的工作方式与普通的submit按钮类似。如果表单无效,则使用此按钮添加新行无效。如果表单有效,则按钮仅工作一次。顺便说一句,使用datatable和rowEditor正是我想要做的。@MarcusSchultö欢迎使用。“如果表格无效”是什么意思??我做了你想在我的应用程序中做的事情。当您单击Add按钮时,您将调用支持bean中的actionListener,它将向arraylist(保存datatable行)添加另一个行对象(无论datatable行存储什么)。你能把你的代码贴在“添加”按钮后面吗?我更新了代码片段。如您所见,表单中还有一个额外的inputText“name”。如果未设置名称,则表单无效,并且不会添加新行。如果设置了名称,则会在“pricesList”中添加一个新行,但它只能工作一次。p:rowEditor showcase示例的Url不再有效。