3

JSFとPrimeFacesで商品価格を追加・編集するフォームを開発しています。に示されているボリュームに応じて、1 つの製品に複数の価格が設定される場合があり<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>

最初のボタン「別の価格を追加」は、本来の目的である「priceList」に新しい行を追加します。ただし、フォームが有効な場合のみ (product-name が設定されていない場合、フォームは無効です)。

私の問題は、フォームに2つのコマンドボタンがあることですが、コマンドボタンなしで目的の機能を取得する方法がわかりません。私は多くの方法を試しました:「別の価格を追加」を<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 に答える