我正在使用 执行服务器操作p:commandButton
。完成这些操作后,我正在刷新表单(以显示隐藏字段)并显示对话框。我也尝试过只刷新带有隐藏按钮的面板,但效果是一样的:
在我调用之后第二次刷新启动dialog.show().
问题是,对话框内定义的小部件和对话框本身目前不存在!因此,当我的 JavaScript 代码运行速度过快时,在更新对话框的帖子完成之前,我遇到了一个异常,因为我要修改的对象在 DOM 树中不存在。
所以我的第一个问题,是否可以避免这种情况和第二次刷新,对话框不能与页面一起刷新吗?
其次,如果第一个无法回答,我如何在第二个帖子完成后启动我的代码?当对话框组件的刷新完成时,我只需要一个回调,然后运行我的操作。
<p:commandButton id="doTask" value="Do task" widgetVar="doTaskButton"
action="#{service.doTask}" update="@form"
onclick="disableMainButtons()"
oncomplete="async.showAsyncDialog()" />
HTTP 序列:
// button click
POST http://localhost:9080/myapp/order.xhtml 200 OK
// oncomplete launches dialog.show()
// I receive answer from COMET before the dialog to display it is shown
POST http://localhost:9080/myapp/channel/async 200 OK
// refresh triggered by dialog.show(), only now the dialog is shown and it's widgets are rendered
POST http://localhost:9080/myapp/order.xhtml 200 OK