JSF中延迟返回commandButton以等待DOM更新的问题
问题解决:订单预览返回后状态不更新的问题
问题根源
你当前的setTimeout写法完全错误,导致延迟逻辑根本没生效。现在的代码里setTimeout(9000000);只是执行了一个无效的延迟(参数不是函数),后面的updateColumns和resetOrderBy会立刻执行,完全起不到等待DOM更新的作用。
修正方案
1. 正确使用setTimeout语法
把需要延迟执行的函数包裹在setTimeout的第一个参数里,调整oncomplete的内容:
oncomplete="setTimeout(function() { updateColumns(true); resetOrderBy(); }, 500);"
这里把延迟设为500毫秒(可根据实际情况调整),确保后端状态更新和DOM渲染完成后再执行列表更新逻辑。
2. 优化后端逻辑(更可靠的方案)
前端延迟只是权宜之计,更根本的是确保后端在处理返回请求时,先完成订单状态从“未读”到“已读”的更新,再返回响应给前端。这样前端在oncomplete触发时,后端数据已经完全同步,不需要依赖前端延迟。
3. 检查DOM更新目标
确认@(.docPnl)确实是订单列表所在的容器选择器,确保update属性能正确命中需要刷新的区域。如果选择器不对,即使数据更新了,DOM也不会重新渲染。
修正后的完整代码示例
<g:documentViewer value="#{cc.attrs.value.viewer}" rendered="#{cc.attrs.value.viewer!=null}"> <f:facet name="actions"> <p:commandButton id="backbtn" value="#{'back'}" immediate="false" process="@this" update="@(.docPnl)" styleClass="#{'btn btn-primary'}" oncomplete="setTimeout(function() { updateColumns(true); resetOrderBy(); }, 500);"> <f:setPropertyActionListener target="#{cc.attrs.value.viewer}" value="#{null}"/> </p:commandButton> </f:facet> </g:documentViewer>
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

