在p:commandButton中刷新两次,与oncomplete竞争condtition

时间:2013-01-25 15:09:36

标签: javascript jquery jsf primefaces

我正在使用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

1 个答案:

答案 0 :(得分:0)

从编程的角度来看,这种解决方法并不精彩,就是检查对话框是否呈现,如果没有,则延迟我的程序。如果对话框仍未呈现,请再次延迟等。

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

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

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