Primefaces Growl onclose событие?
Есть ли способ определить, когда диалог рычания был закрыт, и действовать в соответствии с этим событием?
В руководстве пользователя PrimeFaces нет никаких событий ajax для рычания, а также нет никаких атрибутов обработчика onclose или oncomplete javascript.
Причина, по которой я нуждаюсь в этом, заключается в том, что я использую средство опроса, которое отключается при открытии диалога, и я хочу повторно активировать средство опроса после закрытия сообщения рычания.
Я возобновлял поллер после закрытия исходного диалога, но по какой-то причине добавление рыка нарушило реактивацию поллера. Перезапущенный поллер опросил один раз, пока не появилось рычание, затем остановился.
Итак... моя идея состоит в том, чтобы переместить активацию опроса до того, как рычание закроется.
Код состоит из нескольких фрагментов, в одном фрагменте есть поллер, который можно запустить и остановить с помощью кнопки панели инструментов (только показанный здесь поллер):
<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>
И затем в компоненте поддержки есть обработчики событий, которые приостанавливают и возобновляют опрос
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 до закрытия рычаний?
Или... в качестве альтернативы (и даже лучше), чтобы исправить первоначальную проблему, чтобы рычание сломало поллер?
ура
[редактировать ]
Дополнительная информация об активном статусе опроса.
Мы проверяем и контролируем активное состояние опроса, используя следующий код в Бине:
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);
}
}
1 ответ
Руководство пользователя Primefaces говорит об использовании requestContext.execute следующее:
RequestContext предоставляет способ выполнить javascript после завершения ajax-запроса, этот подход проще по сравнению с передачей параметров обратного вызова и выполнением условного javascript.
Поэтому, если вы хотите использовать RequestContext.execute, никогда не ставьте свои командные кнопки на ajax="False", потому что тогда requestContext не работает.
Также проверьте, работает ли ваш Poller, это хорошая практика, потому что я заметил, что если вы позвоните POLLER_DATATABLE_CLIENT_ID + ".start();"
Опрос начинается с нового экземпляра, но вы больше не можете его остановить. Я не знаю, это ошибка или ожидаемое поведение.
Для чистой проверки вы можете использовать следующий код, чтобы проверить, нужно ли запускать программу опроса снова:
requestContext.execute("if(!" POLLER_DATATABLE_CLIENT_ID +".isActive()){" POLLER_DATATABLE_CLIENT_ID +".start()}");