我正在尝试执行 JSF2 bean 方法,并在单击 PrimeFaces <p:commandButton>
完成该方法后显示一个对话框.
<p:commandButton id="viewButton" value="View"
actionlistener="#{userBean.setResultsForSelectedRow}" ajax="false"
update=":selectedRowValues"
oncomplete="PF('selectedRowValuesDlg').show()">
</p:commandButton>
<p:dialog id="selectedRowValues" widgetVar="selectedRowValuesDlg" dynamic="true">
<h:outputText value="#{userBean.selectedGroupName}" />
</p:dialog>
当我单击命令按钮时,bean 操作监听器方法 setResultsForSelectedRow
正确执行,但该方法完成时不显示对话框。如果我删除 actionlistener
,它显示对话框。我不知道出了什么问题。
事件的执行顺序是什么?是否可以执行actionlistener
和oncomplete
同时?
最佳答案
它失败了,因为您使用了ajax="false"
。这会触发一个完整的同步请求,进而导致整个页面重新加载,从而导致 oncomplete
永远不会触发(请注意,所有其他与 ajax 相关的属性,如 process
、 >onstart
、onsuccess
、onerror
和 update
也永远不会被触发)。
当您删除 actionListener
时它会起作用也是不可能的。它应该以同样的方式失败。也许您还删除了 ajax="false"
,但没有真正理解您在做什么。删除 ajax="false"
确实应该达到所需的要求。
Also is it possible to execute actionlistener and oncomplete simultaneously?
没有。该脚本只能在 Action 监听器之前或之后触发。您可以使用 onclick
在单击时触发脚本。您可以使用 onstart
在即将发送 ajax 请求时触发脚本。但他们永远不会完全同时被解雇。顺序如下:
- 用户点击客户端中的按钮
onclick
JavaScript 代码被执行- JavaScript 根据
process
和当前 HTML DOM 树准备 ajax 请求 onstart
执行 JavaScript 代码- JavaScript 将 ajax 请求从客户端发送到服务器
- JSF 检索 ajax 请求
- JSF 基于
process
处理 JSF 组件树上的请求生命周期 actionListener
执行 JSF 支持 bean 方法action
执行 JSF 支持 bean 方法- JSF 根据
update
和当前 JSF 组件树准备 ajax 响应 - JSF 将 ajax 响应从服务器发送到客户端
- JavaScript 检索 ajax 响应
- 如果 HTTP 响应状态为 200,则
onsuccess
执行 JavaScript 代码 - 否则如果 HTTP 响应状态为 500,则执行
onerror
JavaScript 代码
- 如果 HTTP 响应状态为 200,则
- JavaScript 根据 ajax 响应和当前 HTML DOM 树执行
更新
oncomplete
JavaScript 代码被执行
请注意,更新
是在actionListener
之后执行的,因此,如果您使用的是onclick
或 onstart
显示对话框,那么它可能仍然显示旧内容而不是更新的内容,这对用户体验很差。然后,您最好使用 oncomplete
来显示对话框。另请注意,当您打算执行业务操作时,最好使用 action
而不是 actionListener
。
另请参阅:
关于jsf - 按下 PrimeFaces p :commandButton 时事件的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146630/