我可以控制JSF2部分渲染更新处理的顺序吗?

时间:2012-07-05 19:31:09

标签: jsf jsf-2 primefaces

我有一组特定的组件(primefaces延迟加载数据表和p:消息),它们通过ajax请求中的部分呈现进行更新。我已经在数据表的页面事件中配置了要更新的消息组件,但似乎消息组件总是在数据表之前更新,除非我将它放在数据表组件的相应表单下面。

以下是jsf页面配置的摘要;我还有一些代码在#{lazyDataModel}支持bean的“load”方法中向faces上下文添加消息,并且在检查部分响应(和屏幕结果)时,此消息被添加到更新中对于'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”客户端事件中添加要触发的p:remoteCommand以手动更新消息;以正确的顺序触发,但此时消息不再出现在FacesContext中。

编辑:这似乎是primefaces组件中的一个可能的错误,因为它在RENDER_RESPONSE阶段触发lazyDataModel上的“load”事件,而不是UPDATE_MODEL_VALUES阶段。如果在UPDATE_MODEL_VALUES阶段碰巧更新了它的模型值,那么正确呈现错误消息就没有问题。

1 个答案:

答案 0 :(得分:2)

在RENDER RESPONSE阶段调用

LazyDataModel#load(...)。遗憾的是,您将无法在此方法中放置消息,并将它们显示在数据表之前的msgsBefore组件中。如果您可以移动逻辑以将Faces消息创建到JSF生命周期中较早的位置,例如在页面事件的侦听器方法中,那么将显示msgsBefore组件和msgsAfter组件的消息。

如果你不能这样做,以下内容适合你(适合我):

<p:ajax event="page" 
        update=":reviewRoomsForm:msgsBefore :reviewRoomsForm:msgsAfter"
        oncomplete="$('#reviewRoomsForm\\\\:beforeMessage').html($('#reviewRoomsForm\\\\:afterMessage').html())"