0

「イベント」の編集に使用するページにこれがあります

<f:metadata>
    <f:viewParam id="event_id" name="eventId" value="#{eventController.eventId}"/>
    <f:event type="preRenderView" listener="#{eventController.loadEvent}" />
</f:metadata>

...そして、「ViewScoped」Bean の対応する loadEvent メソッド。

ユーザーが編集するイベントを選択できる「リストイベント」ページで、このようなリンクを作成します

<h:link value="Full details" outcome="/calendar/viewEvent" includeViewParams="true">
    <f:param name="eventId" value="#{calendarController.event.eventId}" />
</h:link>

リンクをクリックするまで loadEvent メソッドが呼び出されるとは思いませんが、'list events' ページにアクセスしたときに一度だけ呼び出されます。

確かに、これは何らかの形で JSF ライフサイクルにかかっています...しかし、なぜでしょうか?

4

1 に答える 1

3

私は Mojarra 2.1.10 でもこれを経験しています (あなたも Mojarra を使っていると思いますか?)。バグはすでにJAVASERVERFACES-2158として提出されており、執筆時点では修正も回避策もありません。問題は次のとおりです。やビュー パラメーターが含まれるUIOutcomeTargetなどのコンポーネントをレンダリングするときに行われるプリエンプティブ ナビゲーション中に、ターゲット ビューがコンパイルされて、その要素から/コンポーネントが抽出されます。このコンパイルには、に基づいて現在のイベント サブスクリプションも設定するという副作用があります。h:linkh:button f:viewParamUIViewParameterh:metadata UIViewRootf:event要素。通常の場合、つまり、応答でユーザーに返されたビューがコンパイルされているときは、これで問題ありません。ただし、ビュー パラメータを取得するために別のビューをコンパイルする場合、現在のビュー ルートにイベント サブスクリプションを登録することは ( のようにFacesContext.getViewRoot()) まったく問題ありません。

于 2012-09-06T12:28:05.143 に答える