我目前正在尝试通过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秒钟。此外,据我所知,在这个微小的时间跨度内,没有任何更新,因为所有字段仍未填充预期值。
我在这里做错了什么?
答案 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();
}