特定のコンポーネントのセット(primefacesの遅延ロードされたデータテーブルとap:messages)があり、これらはajaxリクエストの部分レンダリングを介して更新されています。メッセージコンポーネントをデータテーブルのページイベントで更新するように構成しましたが、メッセージコンポーネントは、それぞれのフォーム内のデータテーブルコンポーネントの下に配置しない限り、常にデータテーブルの前に更新されるようです。
これがjsfページ設定の要約です。また、バッキングBeanの「load」メソッド内のfacesコンテキストにメッセージを追加するコードも少しあります。#{lazyDataModel}
部分的な応答(および画面の結果)を調べると、このメッセージは「msgsAfter」の更新に追加されます。ただし、「msgsBefore」ではありません。
<h:form id="reviewRoomsForm">
<p:messages id="msgsBefore" globalOnly="true" showDetail="true" />
<p:dataTable id="hotelRooms" var="room" value="#{lazyDataModel}" paginator="true"
rows="10" emptyMessage="#{msg.noRecordsFound}">
<p:ajax event="sort" update=":reviewRoomsForm:msgsBefore :reviewRoomsForm:msgsAfter" />
<p:ajax event="page" update=":reviewRoomsForm:msgsBefore :reviewRoomsForm:msgsAfter" />
...
</p:dataTable>
<p:messages id="msgsAfter" globalOnly="true" showDetail="true" />
<br />
</h:form>
疑問に思っていますが、部分レンダリングでコンポーネントが更新される順序を制御する方法(JSF2またはPrimfaces固有)はありますか?または、更新の順序を明示的に指定できない場合、あるコンポーネントが別のコンポーネントに依存していることを伝える方法はありますか(したがって、別のコンポーネントの後に更新する必要があります)?私の最終的な目標は、レイジーページングテーブルなどの部分的な更新中にエラーが発生した場合でも、ページの上部にメッセージを表示することです。
私が試したこと:
- 「update」属性のコンポーネントIDを並べ替えます。問題ではないようです。反復の順序は、親コンポーネントのgetFacetsAndChildren()によって制御されているようです。
- ページイベントの「oncomplete」クライアントイベントで起動されるap:remoteCommandを追加して、メッセージを手動で更新します。正しい順序で発生しますが、この時点でメッセージはFacesContextに存在しなくなります。
編集:これは、UPDATE_MODEL_VALUESフェーズではなく、RENDER_RESPONSEフェーズ中にlazyDataModelで「load」イベントを発生させるという点で、primefacesコンポーネントで発生する可能性のあるバグのようです。UPDATE_MODEL_VALUESフェーズ中にモデル値が更新された場合、エラーメッセージを適切にレンダリングすることに問題はありません。