jsf - 按下 PrimeFaces p :commandButton 时事件的执行顺序

标签 jsf jsf-2 primefaces action commandbutton

我正在尝试执行 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 ,它显示对话框。我不知道出了什么问题。

事件的执行顺序是什么?是否可以执行actionlisteneroncomplete同时?

最佳答案

它失败了,因为您使用了ajax="false"。这会触发一个完整的同步请求,进而导致整个页面重新加载,从而导致 oncomplete 永远不会触发(请注意,所有其他与 ajax 相关的属性,如 process >onstartonsuccessonerrorupdate 也永远不会被触发)。

当您删除 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 代码
  • JavaScript 根据 ajax 响应和当前 HTML DOM 树执行更新
  • oncomplete JavaScript 代码被执行

请注意,更新是在actionListener之后执行的,因此,如果您使用的是onclick onstart 显示对话框,那么它可能仍然显示旧内容而不是更新的内容,这对用户体验很差。然后,您最好使用 oncomplete 来显示对话框。另请注意,当您打算执行业务操作时,最好使用 action 而不是 actionListener

另请参阅:

关于jsf - 按下 PrimeFaces p :commandButton 时事件的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146630/

相关文章:

css - 如何在 acefaces 数据表上应用 css 并最小化其宽度

jsf - 如何在另一个托管 bean 中访问一个托管 bean 的属性

jsf - 无法以编程方式设置 DataTable 的初始排序顺序

validation - 仅当按下某个命令按钮时才根据需要验证输入

java - JSF 和 HTML 表单的 Unicode 问题?

jsf - 复合组件和ID

jsf - 让 PrimeFaces 消息在 5 秒后消失

java - JSF/JAVA boolean 切换器(JSF 私有(private),Beans 公共(public)静态)

jsf - 验证错误 : Value is not valid for SelectManyCheckBox

jsf - 带子表和多项选择的 Primefaces 数据表