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

Update a dialog without closing it immediately?

本文关键字:对话框 更新      更新时间:2023-09-26

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

触发器来自primefaces推送,所以我尝试通过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秒钟。此外,据我所见,在这个微小的时间跨度内,还没有任何更新,因为所有字段仍然没有填充预期值。

我在这里做错了什么?

您的技术问题是由<p:remoteCommand>执行"fire-and-forget"异步(ajax)请求引起的。基本上,在发送ajax请求后,votingDialogRefresh()函数调用立即返回并前进到显示对话框的PF('votingDialogWindow').show()。但是当<p:remoteCommand>的ajax响应稍后返回时,它将更新整个对话框。显然,对话框的默认状态是"关闭"。因此,它将在视觉上立即关闭。默认状态由visible属性控制;如果你使用了visible="#{facesContext.postback}",它会显示为打开的,这只会对用户体验不利,因为最终用户会看到对话框的内容在打开后不久就被更新/更改,这很令人困惑。

您应该在ajax请求完成并更新对话框时打开对话框,而不是在激发ajax请求之前,也不是在更新对话框之前。您只需将调用移动到<p:remoteCommand>oncomplete即可实现这一点。

function onStart(data) {
    votingDialogRefresh();
}

<h:form>
    <p:remoteCommand name="votingDialogRefresh" update="votingDialogWindow" 
        oncomplete="PF('votingDialogWindow').show()" />
</h:form>