更新对话框而不立即关闭它?

时间:2016-04-16 18:13:55

标签: javascript jsf primefaces

我目前正在尝试通过Javascript打开一个对话框,并在显示对话框本身之前更新其元素。

触发器来自primefaces push,因此我尝试通过JavaScript处理它。

基本上流程是这样的:

<p:socket onMessage="onStart" channel="/votingStartChannel" /> 

套接字触发JavaScript:

function onStart(data)
{                                                   
    votingDialogRefresh();
    PF('votingDialogWindow').show();
}

请注意,我的对话框名为votingDialogWindow

另一个函数votingDialogRefresh();触发以下内容:

<h:form>
    <p:remoteCommand name="votingDialogRefresh" update="votingDialogWindow" />
</h:form>

在显示对话框之前“应该”更新对话框。

但是,只要我启动流程,对话框就会立即打开和关闭。我看到它就像3秒钟。此外,据我所知,在这个微小的时间跨度内,没有任何更新,因为所有字段仍未填充预期值。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

您的技术问题是由<p:remoteCommand>执行&#34;火灾而忘记&#34;异步(ajax)请求。基本上,在发送ajax请求之后,votingDialogRefresh()函数调用会立即返回并前进到显示对话框的PF('votingDialogWindow').show()。但是当<p:remoteCommand>的ajax响应稍后返回时,它将更新整个对话框。显然,对话框的默认状态是&#34;关闭&#34;。所以它会在视觉上立即关闭。默认状态是由visible属性控制的方式;如果您使用过visible="#{facesContext.postback}",它就会显示已打开,这对用户体验来说很差,因为最终用户会看到对话框的内容在打开后不久就会更新/更改,这是混乱。

您应该在完成ajax请求并更新对话框时打开对话框,而不是在触发ajax请求之前或更新对话框之前。您只需将调用移至oncomplete的{​​{1}}即可实现此目的。

<p:remoteCommand>

function onStart(data) {
    votingDialogRefresh();
}