2013-06-26 22 views
1

我正在嘗試使用選項添加行的表單。但是,在我輸入一些輸入並再次點擊添加按鈕後,輸入我輸入消失。我不確定我的代碼有什麼問題。另外,當我點擊添加按鈕時,頁面刷新。有沒有辦法阻止這個頁面刷新?JF2動態表單元素不記得每次添加元素時的輸入和頁面刷新

Person.java

public class Person{ 

    private List<String> guys = new ArrayList<String>(); 

public List<String> getGuys() { 
    return guys; 
} 
public void setGuys(List<String> guys) { 
    this.guys = guys; 

public void addNewItem(){ 
    guys.add(""); 
} 
} 

form.xhtml

 <h:form> 
     <h:panelGrid columns="2">    
      <h:outputText value="Guys: " /> 
      <h:dataTable value="#{person.guys}" var="men"> 
      <h:column> 
       <p:inputText value="#{men}" /> 
      </h:column> 
      </h:dataTable> 
      <h:commandButton name="add" value="Add" action="#{person.addNewItem}" /> 
     </h:panelGrid> 
     <br /> 
     <h:commandButton name="submit" type="submit" value="Submit"></h:commandButton> 
    </h:form> 

回答

3

前提是豆被放置在功能要求的正確範圍,視圖範圍,唯一留下的重大錯誤是您期望String類具有一些魔術設置方法。

它沒有。 String類是不可變的。以下將永遠不會在String工作:

<p:inputText value="#{men}" /> 

你有2種選擇:

  1. 創建一個真正的模型類。您可以在下面的答案找到完整的例子:


  2. 設置由行索引而不是值:

    <h:dataTable binding="#{table}" value="#{person.guys}"> 
        <h:column> 
         <p:inputText value="#{person.guys[table.rowIndex]}" /> 
        </h:column> 
    </h:dataTable> 
    

    (注:該選項卡不需要額外的bean屬性嘞!代碼是原樣)

    這基本上是一個person.getGuys().add(table.getRowIndex(), submittedValue)。即該設置器在List本身上被調用,這很好地工作。又見關於ui:repeat以下相關答案:

+0

謝謝!這工作很好。你知道如何在不刷新頁面的情況下添加新行嗎?我想我應該使用Ajax,但我不知道如何。創建一個未呈現的inputText並在我想添加另一行時渲染它嗎? – user2471366

+0

通過''內部的'或者替換爲 @form「>'。將來,請在這裏單獨提問問題。 – BalusC

+0

對不起。下次我會這樣做。非常感謝你! – user2471366

-1

它,因爲你沒有爲豆的範圍內,所以其請求範圍,所以當你調用動作豆您可以使用sessionScope或conversationScope修復此問題

0

您從不更新您的列表,您只是添加空白項目。你應該做這樣的事情: Person.java(viewscoped)

public class Person implements Serializable { 
    private List<String> guys = new ArrayList<String>(); 
    private HtmlDataTable dtGuys; 

    public void addNewItem() { 
    guys.add(""); 
    } 

    public void addToList(ValueChangeEvent e) { 
    guys.set(dtGuys.getRowIndex(), e.getNewValue().toString()); 
    } 

    public String save() { 
    System.out.println("saving..."); 
    for (String item : guys) { 
     System.out.println("item= " + item); 
    } 
    return null; 
    } 
    //gettes and setters 
} 

form.xhtml

<h:form id="frmPrincipal"> 
    <h:panelGrid columns="2"> 
    <h:outputText value="Guys: " /> 
    <h:dataTable value="#{person.guys}" var="men" binding="#{person.dtGuys}" > 
     <h:column> 
     <p:inputText value="#{men}" valueChangeListener="#{person.addToList}" /> 
     </h:column> 
    </h:dataTable> 
    <h:commandButton name="add" value="Add" action="#{person.addNewItem}" /> 
    </h:panelGrid> 
    <br /> 
    <h:commandButton id="submit" name="submit" value="Submit" action="#{person.save}"/> 
</h:form> 

使用JSF 2.0.10和primefaces 3.5

相關問題