フォームがあるとします。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()); }
}
私はできた:
- フィールドの要件を削除 - オプションではありません。
immediate="true"
ボタンを追加するために追加します。検証は現在問題ではありませんが、入力されたが送信されていないすべての値が消えてしまいます。@form
そして、新しく追加されたフィールドのみが によってレンダリングされるため、更新する必要がありますui:repeat
。process="@this"
ボタンを追加するために追加しようとしました。残念ながら、それは何も変わりませんでした。入力フィールドの値は処理されませんが、フォームを更新する必要があります。上記のように、送信されていない値を失っています。
私は何が欠けていますか?回避策はありますか?