我目前正在尝试通过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>执行“即发即弃”异步(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>
标签:jsf,primefaces,javascript 来源: https://codeday.me/bug/20191027/1942062.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。