我正在尝试制作一个带有添加行选项的表单。但是,当我输入一些输入并再次单击添加按钮后,我输入的输入消失了。我不确定我的代码有什么问题。此外,当我单击添加按钮时,页面会刷新。有办法停止此页面刷新吗?
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("");
}
}
表单.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>
最佳答案
如果将 bean 放置在满足功能要求的正确范围(即 View 范围)中,那么剩下的唯一主要错误是您期望 String
类具有某种神奇的 setter 方法。
还没有。 String
类是不可变的。以下内容永远不会在 String
上工作:
<p:inputText value="#{men}" />
您有 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)
。 IE。 setter 在 List 本身上调用,效果非常好。另请参阅以下有关ui:repeat
的相关答案:
关于java - JF2动态表单元素不记得输入,每次添加元素时页面都会刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330569/