1

行を追加するオプションを備えたフォームを作成しようとしています。ただし、入力を入力して追加ボタンをもう一度クリックすると、入力した入力が消えます。コードの何が問題なのかわかりません。さらに、追加ボタンをクリックすると、ページが更新されます。このページの更新を停止する方法はありますか?

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

3 に答える 3

3

Bean が機能要件の正しいスコープであるビュー スコープに配置されている場合、残っている唯一の大きな間違いは、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

于 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 に答える