1

この質問はとても単純に思えますが、私は間違いを見つけられませんでした。

わかりました、どうぞ: IP のリスト (何でも) を含むフォームがあり ます
。IP n : [INPUT-FIELD] [「追加」ボタン]
IP n+1 : [INPUT-FIELD] [「追加」ボタン]
IP は最初から存在します。これらはマネージド Bean のコンストラクターで初期化されます。

[追加] ボタンをクリックすると、現在の IP が検証されます。その後、java.util.List に別のエントリを追加すると、JSF フォームに別の行が表示されます。

IP n+2 : [入力フィールド] [「追加」ボタン]

等々。

(新しい IP を使用して) 行を追加し、現在の IP を検証すると、既存の値IP nおよびIP n+1に対して完全に機能しますが、動的に追加されたIP n+2では検証および追加は機能しません。動的に生成された入力フィールドの検証も、新しく作成された「追加」ボタンで別の行を追加することもできません。

私は何を間違っていますか?

<h:form id="frmSpecial" prependId="false">
    <h:panelGroup id="tblDestFw">
        <c:forEach items="#{bean.fwdest}" var="fwdest">
            IP: <h:inputText value="#{fwdest.ip}" validator="#{bean.validateIP}"/>
            <h:commandButton action="#{bean.addFwDest()}" 
                             value="&gt;&gt;" title="Add another line">
                <f:ajax execute="@this" render="tblDestFw"/>
            </h:commandButton>
            <br/>
        </c:forEach>
    </h:panelGroup>
</h:form>

@ManagedBean(name = "bean")
@ViewScoped
public class EnterNewSystemFW implements Serializable {
     List<FirewallDest> fwdest;
     public EnterNewSystemFW() {
         fwdest.add(new FirewallDest("N"));
         fwdest.add(new FirewallDest("N+1"));
     }

     public void addFwDest() {
         fwdest.add(new FirewallDest());
     }
}

ありがとう。

ベルント

4

1 に答える 1

0

新しい行の追加<c:forEach>に関しては、ビュー スコープの Bean プロパティを参照します。JSF issue 1492により、この Bean はリクエストごとに再構築されます。

<ui:repeat>orのような通常の JSF コンポーネントに置き換えると、<h:dataTable>期待どおりに動作します。

<ui:repeat value="#{bean.fwdest}" var="fwdest">
    ...
</ui:repeat>

検証の実行に関して<f:ajax execute="@this">は、入力ではなく、現在のコンポーネント (コマンド ボタン) のみを処理します。代わりに使用<f:ajax execute="@form">して、フォーム全体を処理します。

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

于 2012-07-31T19:34:32.263 に答える