Jsf 如何从primefaces中的javascript触发组件刷新?
是否可以从javascript更新PrimeFaces组件,以便强制刷新 我在对话框中使用此按钮进行ajax保存调用。 我已将自定义javascript附加到oncomplete事件上Jsf 如何从primefaces中的javascript触发组件刷新?,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,是否可以从javascript更新PrimeFaces组件,以便强制刷新 我在对话框中使用此按钮进行ajax保存调用。 我已将自定义javascript附加到oncomplete事件上 <p:growl life="1500" id="showmessage"/> <p:dialog id="addMemberDialog" widgetVar="addMemberDlg"> <!-- More Code --> <p:commandBu
<p:growl life="1500" id="showmessage"/>
<p:dialog id="addMemberDialog" widgetVar="addMemberDlg">
<!-- More Code -->
<p:commandButton value="Save"
actionListener="#{memberManagedBean.save}"
oncomplete="handleSaveNewMember(xhr, status, args)"
update=":memberListForm:membersTable createupdateform "
process="@form" />
</p:dialog>
我的问题是,如何对UI排序,以便在咆哮组件显示meesage之前,我应该先隐藏对话框
function handleSaveNewMember(xhr, status, args) {
addMemberDlg.hide();
//update the growl after the dialog was hidden?
}
发生的情况是,咆哮组件同时显示在对话框旁边
谢谢。您可以随时执行类似操作(从“保存按钮更新”属性中删除showmessage id)
函数handleSaveNewMember(xhr、状态、参数){
...
jQuery(“#myBtn”)。单击();
}
编辑
但无论如何,在当前代码中,对话框不是在grwol更新的同时关闭吗?为什么不能将p:dialog放在
< h:panelGroup id="addUser" rendered = "boolean value " >
< p:dialog id="addMemberDialog" widgetVar="addMemberDlg" >
<!-- More Code -->
< p:commandButton value="Save" actionListener="#{memberManagedBean.createOrUpdate}"
oncomplete="handleSaveNewMember(xhr, status, args)"
update=":memberListForm:membersTable createupdateform :showmessage :addUser"
process="@form" />
< /p:dialog >
< /h:panelGroup>
应在保存方法中设置的布尔值。在保存方法中将其设置为false时,更新时将不会显示。所以只会显示咆哮信息。但是在调用这个save方法之前,这个布尔值设置为true 您可以使用PrimeFaces'进行此操作
将作为
然而,在这种特殊情况下,有一种更简单的方法。将
的autoUpdate
属性设置为true
它将在每次ajax请求时自动更新自身。如果您的组件实际上不支持它,那么您可以始终将其包装在一个也支持该属性的
中
...
我的建议:
与actionListener
属性一起使用。此属性调用包含FacesContext.addMessage
code的支持bean方法,方法如下:
handleSaveNewMember
脚本中,在addMemberDlg.hide()之后调用remoteCommand
name
属性代码>这样:
。然后,函数handleSaveNewMember(xhr,status,args){addMemberDlg.hide();testScript();}
update
属性添加到remoteCommand
指向咆哮组件:
命令按钮
正常问候。您可以使用名为p:remotecommand的PrimeFaces元素。此元素将执行一个操作(例如,调用bean方法)并在该操作之后执行更新 这篇文章中有一个例子。PrimeFaces有一个例子。您可以使用
PrimeFaces.ajax.Request.handle(cfg)
,或较短版本PrimeFaces.ab(cfg)
,通过使用config对象的update
属性触发更新
您可能需要根据自己的需要设置过程
属性。如果不需要处理任何内容,请将其设置为@none
然后,您需要设置source
属性。可以使用EL:{component.clientId}
将其设置为当前组件
把这些放在一起,你会得到:
PrimeFaces.ab({source:'{component.clientId}',进程:'@none',更新:'clientedtoupdate'})
我创建了一个用于将其简化为{my:ajaxUpdate('clientIdToUpdate')}
:
公共静态字符串ajaxUpdate(最终字符串clientId){
返回“PrimeFaces.ab({source:'”
+UIComponent.getCurrentComponent(Faces.getContext()).getClientId()
+“,进程:'@none',更新:”
+客户
+ "'})";
}
这将减少(例如):
...
致:
您的意思是需要一个“虚拟”按钮,而这不能通过一些javascript api实现吗?如果是这样的话,我想我应该只关注这个链接。既然一切都是ajaxified的,那么我应该触发来自客户端本身的消息。我的理解正确吗?但在您的情况下,您希望从服务器发送消息,而不是从js。。。关于我的方法。。。我想还有其他方法。。。但这就是我从js触发jsf元素“重新呈现”的方式:)哦,你说得对。我已从更新列表中删除showmessage,因为这将自动显示facesmessage。让我试着进一步解释一下,单击保存按钮,我已经将facesmessage排队。由于咆哮的自动更新为false,因此消息不会显示。这就是oncomplete javascript函数的目的。发生的情况是,我将首先隐藏对话框,然后我希望咆哮刷新并显示我的排队消息。这有可能吗?我唯一能想到的方法就是我提出的方法。。。但无论如何,在您当前的代码中,对话框不是在更新grwol的同时关闭的吗?您必须在单击按钮时显示对话框。您是否尝试从该按钮而不是对话框中的“保存”按钮更新咆哮?答案通常应包含一些上下文,而不仅仅是链接。这更适合作为对该问题的评论。看:谢谢你的建议。我编辑了评论以实现这一功能。仅供参考,如果读者使用的是侏罗纪版本的PF,growl的自动更新仅在3.0及以上版本中提供。而autoUpdate=“…”
属性在6.2 elite版本中被弃用,取而代之的是<h:commandButton style="display:none" id="myBtn" >
<f:ajax render=":showmessage"/>
</h:commandButton>
function handleSaveNewMember(xhr, status, args) {
...
jQuery("#myBtn").click();
}
< h:panelGroup id="addUser" rendered = "boolean value " >
< p:dialog id="addMemberDialog" widgetVar="addMemberDlg" >
<!-- More Code -->
< p:commandButton value="Save" actionListener="#{memberManagedBean.createOrUpdate}"
oncomplete="handleSaveNewMember(xhr, status, args)"
update=":memberListForm:membersTable createupdateform :showmessage :addUser"
process="@form" />
< /p:dialog >
< /h:panelGroup>