我有一组特定的组件(primefaces 延迟加载的数据表和 ap: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() 控制的
- 添加 ap:remoteCommand 在“oncomplete”客户端事件中触发,以便页面事件手动更新消息;以正确的顺序触发,但此时消息不再在 FacesContext 中。
编辑:这似乎是 primefaces 组件中的一个可能错误,因为它在 RENDER_RESPONSE 阶段而不是 UPDATE_MODEL_VALUES 阶段触发了lazyDataModel 上的“加载”事件。如果它碰巧在 UPDATE_MODEL_VALUES 阶段更新了它的模型值,那么适当地呈现错误消息就没有问题。