1

我正在尝试制作一个带有添加行选项的表单。但是,在我输入一些输入并再次单击添加按钮后,我输入的输入消失了。我不确定我的代码有什么问题。此外,当我单击添加按钮时,页面会刷新。有没有办法停止此页面刷新?

人.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>
4

3 回答 3

3

如果 bean 被放置在功能需求的正确范围内,即视图范围内,剩下的唯一主要错误是您期望String该类具有一些神奇的 setter 方法。

它没有。String类是不可变的。以下将永远不会在 a 上工作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自身上调用setter,它工作得很好。另请参阅以下有关的相关答案ui:repeat

于 2013-06-27T02:40:48.500 回答
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
}

表单.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

于 2013-06-26T23:30:49.933 回答
-1

这是因为您没有该 bean 的范围,因此它的请求范围有限,因此当您调用再次创建 bean 的操作时,您可以使用 sessionScope 或 conversationScope 修复此问题

于 2013-06-26T23:30:12.610 回答