1

我有一组特定的组件(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 阶段更新了它的模型值,那么适当地呈现错误消息就没有问题。

4

1 回答 1

2

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

如果你不能这样做,以下应该对你有用(对我有用):

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