0

我正在使用 执行服务器操作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
4

1 回答 1

0

解决方法,从编程的角度来看并不漂亮,是检查对话框是否被渲染,如果没有,延迟我的过程。如果对话框仍未呈现,请再次延迟等。

waitForDialogRendered: function() {
    var visible = asyncDialog.jq.css('visibility') == 'visible';
    if (!visible) {
        setTimeout(waitForDialogRendered, 250);
        return;
    }
    runComet();
}

即使用户看不到对话框,也不会返回asyncDialog.jq.is(':visible')true

不过,如果不需要编写这样的代码,我会更开心。

于 2013-01-25T15:48:43.230 回答