我有一组特定的组件(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)来控制部分渲染中组件更新的顺序?或者,如果我不能明确指定更新的顺序,是否有办法传达一个组件依赖于另一个组件(因此应该在另一个组件之后更新)? 我的最终目标是将消息显示在页面顶部,即使在部分更新期间发生错误时(例如在惰性分页表中)也是如此。
我尝试过的事情:
编辑:这似乎是primefaces组件中的一个可能的错误,因为它在RENDER_RESPONSE阶段触发lazyDataModel上的“load”事件,而不是UPDATE_MODEL_VALUES阶段。如果在UPDATE_MODEL_VALUES阶段碰巧更新了它的模型值,那么正确呈现错误消息就没有问题。
答案 0 :(得分:2)
LazyDataModel#load(...)
。遗憾的是,您将无法在此方法中放置消息,并将它们显示在数据表之前的msgsBefore组件中。如果您可以移动逻辑以将Faces消息创建到JSF生命周期中较早的位置,例如在页面事件的侦听器方法中,那么将显示msgsBefore组件和msgsAfter组件的消息。
如果你不能这样做,以下内容适合你(适合我):
<p:ajax event="page"
update=":reviewRoomsForm:msgsBefore :reviewRoomsForm:msgsAfter"
oncomplete="$('#reviewRoomsForm\\\\:beforeMessage').html($('#reviewRoomsForm\\\\:afterMessage').html())"