1

特定のコンポーネントのセット(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フェーズ中にモデル値が更新された場合、エラーメッセージを適切にレンダリングすることに問題はありません。

4

1 に答える 1

2

LazyDataModel#load(...)RENDERRESPONSEフェーズ中に呼び出されます。残念ながら、このメソッドにメッセージを配置して、データテーブルの前にあるmsgsBeforeコンポーネントにメッセージを表示させることはできません。ロジックを移動して、JSFライフサイクルの早い段階でFacesメッセージを作成できる場合、たとえばページイベントのリスナーメソッドで、メッセージはmsgsBeforeコンポーネントとmsgsAfterコンポーネントの両方に表示されます。

あなたがそれをすることができないならば、以下はあなたのために働くはずです(私のために働きます):

<p:ajax event="page" 
        update=":reviewRoomsForm:msgsBefore :reviewRoomsForm:msgsAfter"
        oncomplete="$('#reviewRoomsForm\\\\:beforeMessage').html($('#reviewRoomsForm\\\\:afterMessage').html())"
于 2012-07-06T19:32:44.630 に答える