0

セットアップ: 2 つのフォーム A と B があります。フォーム A に commandLink があります。

<h:commandLink actionListener="#{homeView.selectDiv('homeUpdates')}">#{msg.homeUpdates}
   <f:ajax render=":B" execute="@this" />
</h:commandLink>

...フォーム B を更新します。

問題は、ajax リンクをクリックすると、フォーム A も再構築され、私が持っている ui:repeat から例外が発生することです。これは正しい動作ですか?フォームAも再構築する必要がありますか?

私は JSF 2.2 を使用しており、フォーム A には ui:fragment=>ui:include=>ui:repeat が含まれています

=====SSCCE を追加======= 次のコードは Update B を押した後に実行されません! 二回。IDの重複は例外です。ui:repeat の値は関係ありません

<h:head>
</h:head>

<h:body>
    <h:form id="A">
        <ul class="tableView notification">
            <ui:repeat var="notification" value="#{dashboardBean.notifications}">
                <li>
                    xx
                </li>
            </ui:repeat>
        </ul>

        <h:commandLink value="Update B!" listener="#{dashboardBean.toggleRendered}">
            <f:ajax execute="@this" render=":B" />
        </h:commandLink>

    </h:form>

    <h:form id="B">
    </h:form>
</h:body>
4

1 に答える 1

1

最初のリクエストでビューが作成され、ポストバックでビューが復元されます。明確にするためにJSF 2.2仕様のいくつかのポイントを引用するには(強調は私のものです):

P. 2.2.1 :

リクエストがポストバックでない場合 ... ViewHandler でcreateView()を呼び出します。リクエストがポストバックの場合 ... ViewHandler を呼び出します。現在のリクエストのFacesContextインスタンスとビュー識別子を渡し、復元されたビューの UIViewRoot を返します。

P. 2.5.8 :

JSF ビュー内の選択されたコンポーネントは処理され (部分処理と呼ばれます)、選択されたコンポーネントはクライアントにレンダリングされます (部分レンダリングと呼ばれます)。

P. 13.4 :

JavaServer Faces のライフサイクルは、実行フェーズとレンダリング フェーズで構成されると見なすことができます。部分トラバーサルは、ビュー内の 1 つまたは複数のコンポーネントを「訪問」するために使用できる手法であり、潜在的に、リクエスト処理ライフサイクルの「実行」および/または「レンダリング」フェーズを通過させることができます。

AJAX を使用PartialViewContextすると、復元されたビューを走査するために必要なすべての情報がクラスに含まれます。


したがって、質問に戻ると、<f:ajax render=":B" execute="@this" />セットアップ中に、 を含むフォームのみが再id="B"レンダリングさ<h:form id="B">れます。これは、フォームのネストがないことなどを意味します。

「機能しない」というコメントについては、プレーン ビュー スコープのマネージド Bean を使用した単純なテスト ケースで、期待どおりの結果が得られました。

<h:form id="A" >
    <h:outputText value="#{twoFormsBean.a}"/>
    <h:commandLink actionListener="#{twoFormsBean.actionA}">
        Update B!
        <f:ajax execute="@this" render=":B"/>
    </h:commandLink>
</h:form>
<h:form id="B" >
    <h:outputText value="#{twoFormsBean.b}"/>
    <h:commandLink>
        Update Both!
        <f:ajax execute="@this" render=":A :B"/>
    </h:commandLink>
</h:form>

@ManagedBean
@ViewScoped
public class TwoFormsBean implements Serializable {

    private String a = "A";//getter
    private String b = "B";//getter

    public void actionA(ActionEvent ae) {
        a = "newA";
        b = "newB";
    }

}
于 2013-04-26T13:30:34.100 に答える