0

ユーザーが質問に複数のオプションを追加できるフォーム メーカーを設計しています。そのため、すべてのオプションに新しいオプションの追加ボタンと削除ボタンがあります。追加するオプションの数がわからないため、オプションを動的に追加/削除するために、Facelets ページでa を使用し、マネージド Bean で adataTableにバインドしたいと考えています。HtmlDataTableだから私がしたことは、 my の値が文字列dataTableの aListであるということです。入力テキスト (オプション) が追加および削除され、質問全体を追加すると、DB に正しく保存されます。しかし、追加または削除ボタンが押されるたびに、私のオプションはすべて空であるため、ユーザーはそれらを再度入力する必要があります。私のコードは少し長いので、簡略化したバージョンを提供します。

私のFaceletsページには次のものがあります:

<h:dataTable value="#{questionMaker.selectOneOptionList}" var="option" binding="#{questionMaker.table}"> 
<h:column>                                                                                     
<h:inputText value="#{option}"/>
<h:commandLink value="remove option" action="#{questionMaker.removeRadioButtonOption}"/>                                           
</h:commandLink>
</h:column>
</h:dataTable>

そして、私の管理対象 Bean では、上記の変数は次のとおりです。

private HtmlDataTable table;
private List<String> selectOneOptionList;

もちろん、ゲッターとセッターもあります。これは私の追加方法です:

public void addRadioButtonOption() {
    String option = new String();
    selectOneOptionList.add(option);

}
4

1 に答える 1

2

このアプローチにはいくつかの (潜在的な) 問題があります。

  • このコンストラクトを機能させるには、Bean をビュー スコープにする必要があります (リクエスト スコープでもセッション スコープでもありません)。リクエスト スコープでは、selectOneOptionListはリクエストごとに新しく再作成されます。あなたはそれをしたくありません。セッション スコープでは、Bean はすべてのブラウザ ウィンドウ/タブ間で共有されます。あなたもそれを持ちたくありません。

  • このbinding属性は、ビューのビルド時に実行されます。したがって、ビュー スコープの場合、 JSF 問題 790#{questionMaker}により、暗黙的にリクエスト スコープになります。

  • 不変オブジェクトであるためString 、setter メソッドはありません。は<h:inputText value="#{option}"/>、入力した値を設定できません。

したがって、問題を解決するには、次のことを行う必要があります。

  • Bean が であることを確認してください@ViewScoped
  • binding属性がビュー スコープの Bean プロパティを指さないようにしてください。
  • String完全な JavaBean に置き換えるか、代わりにインデックスでリスト項目にアクセスしてください。

List<String>したがって、これでうまくいくはずです(何らかの理由でまだ固執したいと仮定すると):

<h:dataTable value="#{questionMaker.selectOneOptionList}" binding="#{table}"> 
  <h:column>                                                                                     
    <h:inputText value="#{questionMaker.selectOneOptionList[table.rowIndex]}"/>
    ...
  </h:column>
</h:dataTable>
<h:commandButton value="add" action="#{questionMaker.addRadioButtonOption}" />

@ManagedBean
@ViewScoped
public class QuestionMaker {

    private List<String> selectOneOptionList;

    @PostConstruct
    public void init() {
        selectOneOptionList = new ArrayList<String>();
    }

    public void addRadioButtonOption() {
        selectOneOptionList.add(new String());
    }

    public List<String> getSelectOneOptionList() {
        return selectOneOptionList;
    }

}

以下も参照してください。

于 2012-10-02T13:24:17.830 に答える