2012-09-24 54 views
3

我正在開發一個用JSF和PrimeFaces添加/編輯產品價格的表單。單個產品可以有多個價格,具體取決於<p:dataTable>中顯示的數量。如何在不驗證表單的情況下動態添加新行到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 」。但只有在表單有效的情況下(表單無效,如果沒有設置產品名稱)。

我的問題是,我有兩個commandButtons的窗體,但我不知道如何得到我希望的functionallity沒有commandButton。我嘗試了很多方法:使用ajax功能將「添加另一個價格」更改爲標準<p:button>;由於按鈕的結果不起作用。我試過這個按鈕的「type = button」,但是在這種情況下根本沒有任何反應。

有沒有什麼建議可以實現我希望的功能?沒有必要有一個按鈕來解決我的問題。

回答

7

<p:commandButton>的提交和流程默認整個表單。這將確實驗證所有輸入字段。您可以使用process屬性來控制此屬性,因此默認爲@form。在你的情況下,你可以使用@this,這樣只有命令按鈕自己的動作被調用。

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

就是這樣,謝謝! –

+0

不客氣。 – BalusC

0

使用p:commandButton動態添加行有什麼問題? 如果我不理解你的問題,你顯然需要一個對你的託管bean的請求,以便將你的新行信息添加到你的數據表列表中。如果您對p:commandButton不滿意,您總是可以使用p:commandlink。並編輯行數據,您可以使用p:rowEditorp:datatable

check out the showcase example for datatable row editing

希望這有助於:)

+0

這兩個commandButton本身並不是問題所在。我的問題是,第一個,它應該只添加一個新的行到dataTable並刷新視圖ID,就像一個正常的提交按鈕。如果表單無效,則使用此按鈕添加新行不起作用。如果表單有效,該按鈕只能工作一次。 順便說一句,使用datatable和rowEditor實際上是我想要做的。 –

+0

@MarcusSchultö歡迎來到SO。 「如果表格無效」是什麼意思?我做了你想要在我的應用程序中完成的任務。當你點擊添加按鈕時,你會在後臺bean中調用一個actionListener,它將添加另一個Row對象(無論你的數據錶行是否存儲)到你的ArrayList(它包含數據錶行)。你可以將你的代碼發佈到添加按鈕後面嗎? – PermGenError

+0

我更新了片段。正如你所看到的,表單中還有一個額外的inputText「name」。如果名稱未設置,則表單無效並且不會添加新行。如果名稱已設置,則會向「pricesList」添加一個新行,但它只能運行一次。 –

相關問題