【发布时间】:2012-07-06 06:24:19
【问题描述】:
我有一组特定的组件(primefaces 延迟加载的数据表和一个 p:messages)正在通过 ajax 请求中的部分呈现进行更新。我已将消息组件配置为在数据表的页面事件上更新,但似乎消息组件总是在数据表之前更新,除非我将它放在数据表组件下方的相应表单中。
这里总结一下jsf页面配置;我还有一些代码在 #{lazyDataModel} 支持 bean 的“加载”方法中向 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 特定)来控制在部分渲染上更新组件的顺序?或者,如果我不能明确指定更新的顺序,有没有办法传达一个组件依赖于另一个组件(因此应该在另一个组件之后更新)? 我的最终目标是让消息显示在页面顶部,即使在部分更新期间发生错误(例如在惰性分页表中)也是如此。
我尝试过的事情:
- 在“更新”属性中重新排序组件 ID;似乎没关系。看起来迭代的顺序是由父组件的 getFacetsAndChildren() 控制的
- 在页面事件的“oncomplete”客户端事件中添加要触发的 p:remoteCommand 以手动更新消息;以正确的顺序触发,但此时消息不再在 FacesContext 中。
编辑:这似乎是 primefaces 组件中的一个可能错误,因为它在 RENDER_RESPONSE 阶段而不是 UPDATE_MODEL_VALUES 阶段触发了lazyDataModel 上的“加载”事件。如果它碰巧在 UPDATE_MODEL_VALUES 阶段更新了它的模型值,那么适当地呈现错误消息就没有问题。
【问题讨论】:
-
如果以下答案解决了您的问题,请将其标记为已接受。谢谢。
标签: jsf jsf-2 primefaces