3

我正在开发一种使用 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>

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

我的问题是,我有两个用于表单的命令按钮,但我不知道如何在没有命令按钮的情况下获得我想要的功能。我尝试了很多方法:将“添加另一个价格”更改为<p:button>具有 ajax 功能的标准;由于按钮的结果而不起作用。我为此按钮尝试了“type = button”,但在这种情况下,根本没有任何反应。

是否有任何建议可以实现我想要的功能?没有必要有一个按钮来解决我的问题。

4

2 回答 2

7

默认情况下<p:commandButton>提交和处理整个表单。这确实会验证所有输入字段。您可以使用process默认为 的属性来控制它@form。在您的特定情况下,您可以只使用@this以便仅调用命令按钮自己的操作。

<p:commandButton value="Add another price" process="@this" update="pricesList" action="#{productBean.addNewPrice()}" />
于 2012-09-25T12:05:47.360 回答
0

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

查看数据表行编辑的展示示例

希望这可以帮助 :)

于 2012-09-24T21:57:47.877 回答