我正在使用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
答案 0 :(得分:0)
从编程的角度来看,这种解决方法并不精彩,就是检查对话框是否呈现,如果没有,则延迟我的程序。如果对话框仍未呈现,请再次延迟等。
waitForDialogRendered: function() {
var visible = asyncDialog.jq.css('visibility') == 'visible';
if (!visible) {
setTimeout(waitForDialogRendered, 250);
return;
}
runComet();
}
即使对用户看不到对话框,asyncDialog.jq.is(':visible')
也不会返回true
。
不过,如果不需要编写这样的代码,我会更开心。