有没有办法检测咆哮对话框何时关闭,并对该事件采取行动?
在PrimeFaces用户指南中没有列出针对growl的ajax事件,也没有任何onclose或oncomplete javascript处理程序属性。
我需要这个的原因是我使用的轮询器在打开对话框时被停用,并且我希望在关闭growl消息后重新激活轮询器。
在原始对话框关闭后我重新激活了轮询器,但由于某种原因,增加了咆哮声,打破了轮询器的重新激活。重新启动的轮询器轮询一次,直到咆哮出现,然后停止。
所以..我的想法是在咆哮关闭之前移动轮询器的重新激活。
代码有几个片段,一个片段有轮询器,可以通过工具栏按钮启动和停止(只有这里显示的轮询器):
<h:form id="form-toolbar">
<!-- poller -->
<p:poll id="pollerDataTable"
widgetVar="p4mPollerDataTable"
interval="10"
async="true"
global="false"
update=":form-toolbar:dtItems"
listener="#{controller.refreshDataTable}"
autoStart="false" />
[snip]
</h:form>
一个片段有咆哮:
<h:form id="form-body-growl">
<p:growl id="growlSuccess" for="success" severity="info" infoIcon="/img/LOGO_H150.png"
warnIcon="/img/LOGO_H150.png" errorIcon="/img/LOGO_H150.png"
sticky="false" life="3000"/>
<p:growl id="growlError" severity="warn, error" infoIcon="/img/LOGO_H150.png"
warnIcon="/img/LOGO_H150.png" errorIcon="/img/LOGO_H150.png"
sticky="true" globalOnly="true"/>
</h:form>
一个片段有一个命令按钮来显示对话框:
<p:commandButton id="tbBtnNew"
icon="ui-icon-plus"
title="#{facesUtilsBean.getLocalizedText(webUiConstBean.BUNDLE_BASE_NAME_UI_STRING, 'toolbar.tooltip.new')}"
actionListener="#{controller.onShowNewDialog}"
update=":form-dlgNew:new"
onsuccess="p4mDlgNew.show();"/>
<p:tooltip for="tbBtnNew" showEffect="fade" hideEffect="fade" />
另一个包含正在打开的对话框:
<!-- new dialog -->
<h:form id="form-dlgNew">
<p:dialog header="New" id="dlgNew"
widgetVar="p4mDlgNew" resizable="false" dynamic="true" modal="true" closable="false">
<div class="dialog-container">
<h:panelGrid id="new" columns="3" columnClasses="formText, formValue, formValidation" styleClass="defaultTable" style="width:100%;" rendered="#{not empty controller.editingItem}">
<ui:insert name="newDialogColumns"/>
<p:spacer/>
<p:column colspan="2">
<p:commandButton styleClass="cmdButtonSaveCancel" ajax="false"
value="#{facesUtilsBean.getLocalizedText(webUiConstBean.BUNDLE_BASE_NAME_UI_STRING, 'dialog.save.button')}"
actionListener="#{controller.onSaveNewDialog}" update=":form-toolbar:dtItems, :form-body-growl:growlSuccess, :form-body-growl:growlError"
onsuccess="p4mDlgNew.hide();" process="new"/>
<p:commandButton styleClass="cmdButtonSaveCancel" ajax="false"
value="#{facesUtilsBean.getLocalizedText(webUiConstBean.BUNDLE_BASE_NAME_UI_STRING, 'dialog.cancel.button')}"
actionListener="#{controller.onCancelNewDialog}" update=":form-toolbar:dtItems" onsuccess="p4mDlgNew.hide();" process="@this"/>
</p:column>
</h:panelGrid>
</div>
</p:dialog>
</h:form>
然后在支持bean中有事件处理程序暂停和恢复轮询
public void suspendPolling() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute(POLLER_DATATABLE_CLIENT_ID + ".stop();");
}
public void resumePolling() {
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute(POLLER_DATATABLE_CLIENT_ID + ".start();");
}
public void onShowNewDialog(ActionEvent event) {
if (isAutoRefreshActive()) {
suspendPolling();
}
[snip]
}
/**
* Called by new button template when 'cancel' button clicked.
* Refreshes data and resumes polling if necessary.
*/
public void onCancelNewDialog(ActionEvent event) {
[snip]
if (isAutoRefreshActive()) {
resumePolling();
}
}
/**
* Called by new button template when 'accept' button clicked.
* Refreshes data and resumes polling if necessary.
*/
public void onSaveNewDialog(ActionEvent event) throws PSoftIOException {
[snip]
if (isAutoRefreshActive()) {
resumePolling();
}
}
那么,请问有没有办法将resumePolling功能移动到关闭咆哮之后?
或者......或者更好(甚至更好),一种修复orginial问题的方法,咆哮打破了投手?
干杯
[edit]
有关轮询器活动状态的更多信息。
我们使用Bean中的以下代码检查并控制轮询器的活动状态:
private ToolBarRefreshController getToolBarRefreshController() {
return (ToolBarRefreshController) FacesUtils.resolveBean("toolBarRefreshController");
}
private boolean isAutoRefreshActive() {
ToolBarRefreshController toolBarRefreshController = getToolBarRefreshController();
if (toolBarRefreshController == null) {
return false;
}
return toolBarRefreshController.isAutoRefreshActive();
}
public void startAutoRefresh() {
// nesting starting polling must be prevented
if (!isAutoRefreshActive()) {
refreshDataTable();
resumePolling();
getToolBarRefreshController().setAutoRefreshActive(true);
}
}
public void stopAutoRefresh() {
// nesting stopping polling must be prevented
if (isAutoRefreshActive()) {
suspendPolling();
getToolBarRefreshController().setAutoRefreshActive(false);
}
}
答案 0 :(得分:0)
Primefaces用户指南说明了使用requestContext.execute的以下内容:
RequestContext提供了一种在ajax请求完成时执行javascript的方法 与传递回调参数和执行条件javascript相比,方法更容易。
因此,如果您想使用RequestContext.exe,请不要将您的命令按钮放在ajax =“False”上,因为那时requestContext不起作用。
同时检查你的Poller是否已经运行是一个好习惯,因为我注意到如果你打电话POLLER_DATATABLE_CLIENT_ID + ".start();"
轮询器以一个新实例开始,但你不能再停止了。我不知道这是一个错误还是预期的行为。
要进行干净检查,您可以使用以下代码检查是否需要再次启动轮询器:
requestContext.execute("if(!" POLLER_DATATABLE_CLIENT_ID +".isActive()){" POLLER_DATATABLE_CLIENT_ID +".start()}");