2

フォームがあるとします。1 つp:inputTextは表示されますが、ユーザーは を使用してさらに多くを追加できますp:commandButton。別の で送信する場合は、このすべての値を指定する必要がありますp:commandButton。ユーザーが複数の空の入力フィールドを追加しようとすると、問題が発生します。それらはすべてマークされrequired="true"ているため、1 つのフィールドが空で、ユーザーが別のフィールドを追加しようとすると、検証エラーが表示されます。

ユーザーが必要とする数のフィールドを追加できるようにし、それらに入力して送信するのが最善です。

JSF:

<h:form id="myForm">
    <p:commandButton value="add" actionListener="#{testBean.addNewItem()}" update="@form"/>
    <p:commandButton value="done" update="@form,:p"/>
    <br/>
    <ui:repeat value="#{testBean.list}" var="l">
        <p:inputText value="#{l.name}" required="true"/>
        <br/>
    </ui:repeat>
</h:form>
<p:messages autoUpdate="true"/>
<p:panel id="p">
    #{testBean.list}
</p:panel>

バッキング Bean は特別なことは何もしません。リストのゲッターとセッターのみを提供します。また、空の文字列をリストに追加します。

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
    private List<Item> list = new ArrayList<Item>();

    public List<Item> getList() { return list; }

    public void setList(List<Item> list) { this.list = list; }

    public void addNewItem() { list.add(new Item()); }
}

私はできた:

  1. フィールドの要件を削除 - オプションではありません。
  2. immediate="true"ボタンを追加するために追加します。検証は現在問題ではありませんが、入力されたが送信されていないすべての値が消えてしまいます。@formそして、新しく追加されたフィールドのみが によってレンダリングされるため、更新する必要がありますui:repeat
  3. process="@this"ボタンを追加するために追加しようとしました。残念ながら、それは何も変わりませんでした。入力フィールドの値は処理されませんが、フォームを更新する必要があります。上記のように、送信されていない値を失っています。

私は何が欠けていますか?回避策はありますか?

4

2 に答える 2

-1

このようなものは機能しますか?

<p:inputText value="#{l.name}" required="#{l.name != null ? true : false}"/>

これにより、新しく追加された inputText コンポーネントが必須ではなくなりますが、リスト内の既存の項目が必須になります。

于 2013-08-27T19:34:48.113 に答える