Прохождение действия в <rich:modalPanel>
Вопрос
Есть какой-то способ передать действие в <rich:modalPanel>
.Я хочу написать простое всплывающее окно с кнопками "Да" и "Нет", и я хочу повторно использовать это всплывающее окно на разных страницах, вот почему мне нужно, чтобы при нажатии кнопки "Да" вызывалось другое действие.Есть способ передать некоторое значение в <rich:modalPanel>
с <a4j:actionparam>
:
<a4j:commandButton value="See details…" id="det"
reRender="popup_dataIdField, …">
<rich:componentControl for="popup"
operation="show" event="onclick" />
<a4j:actionparam name="message" assignTo="#{popupBean.message}"
value="#{myBean.message}" />
</a4j:commandButton>
Но есть ли какой - то способ передать действие ?
Решение 2
Я нахожу ответ сам :).Может быть, кому-то это будет полезно.
Я сделал это с помощью Facelets.Когда я включаю всплывающее окно на свою страницу, я передаю ему параметр:
<ui:include src="./WEB-INF/popup/popup.xhtml">
<ui:param name="yesAction" value="${thisPageBean}" />
</ui:include>
Где thisPageBean
- является ли bean тем, из чего вызвано всплывающее окно.
Затем в моем всплывающем окне я написал:
<a4j:commandButton id="yesButton" value="#{msgs.yesButton}"
action="#{yesAction.someAtion}"
</a4j:commandButton>
И этим я призываю thisPageBean.someAtion
.Вся магия - это ${thisPageBean}
, нам это необходимо $
но нет #
.
Другие советы
Поскольку вы используете Facelets, то посмотрите на Статья Рика Хайтауэра и раздел "Переходящие действия".Это тот же базовый метод, что и тот, который вы использовали, но также передающий метод в компоненте.
Например:
<ui:include src="./WEB-INF/popup/popup.xhtml">
<ui:param name="yesAction" value="save"/>
<ui:param name="cancelAction" value="cancel"/>
<ui:param name="backingBean" value="#{thisPageBean}"/>
</ui:include>
А затем во всплывающем окне:
<a4j:commandButton id="yesButton" value="#{msgs.yesButton}"
action="#{backingBean[yesAction]}"/>
Обратите внимание, что вы используете #.
Да, я не вижу никаких проблем с этим.Вы можете использовать мой код, если хотите:
<rich:modalPanel id="popup" width="261" height="386" autosized="true"left="180" top="200" keepVisualState="true">
<h:panelGrid id="panelGrid">
<h:outputText value="#{PopupBean.output}" id="popupMessage"/>
<a4j:commandLink action="#">
<h:outputText value="Close" />
<rich:componentControl for="popup" operation="hide" event="onclick"/>
</a4j:commandLink>
</h:panelGrid>
</rich:modalPanel>
<h:panelGrid columns="2">
<a4j:commandLink action="#" reRender="panelGrid">
<h:outputText value="Yes" />
<rich:componentControl for="popup" operation="show" event="onclick"/>
<a4j:actionparam name="message" assignTo="#{PopupBean.output}" value="#{TestBean.input1}"/>
</a4j:commandLink>
<a4j:commandLink action="#" reRender="panelGrid">
<h:outputText value="No" />
<rich:componentControl for="popup" operation="show" event="onclick"/>
<a4j:actionparam name="message2" assignTo="#{PopupBean.output}" value="#{TestBean.input2}"/>
</a4j:commandLink>
</h:panelGrid>
В основном выходные данные на модальной панели будут содержать значения в testBean
Редактировать (недоразумение):
Я полагаю, вам придется определить свою модальную панель следующим образом:
<rich:modalPanel id="popup" width="261" height="386" autosized="true"left="180" top="200" keepVisualState="true"
binding="#{PopupBean.popupPanel}">
</rich:modalPanel>
И в вашем управляемом компоненте вам нужно будет динамически добавлять дочерние элементы в вашу модальную панель с помощью java следующим образом:
public String action_PoppingThePanel() {
HtmlCommandButton button = new HtmlCommandButton();
button.setValue("Yes");
String action = "#{TestBean.action_yes}";
MethodExpression methodExpression =
FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
createMethodExpression(FacesContext.getCurrentInstance().getELContext(), action, null,
new Class<?>[0]);
button.setActionExpression(methodExpression);
getPopupPanel().getChildren().add(button);
button = new HtmlCommandButton();
button.setValue("No");
String action = "#{TestBean.action_no}";
methodExpression =
FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
createMethodExpression(FacesContext.getCurrentInstance().getELContext(), action, null,
new Class<?>[0]);
button.setActionExpression(methodExpression);
getPopupPanel().getChildren().add(button);
getPopupPanel().setRendered(true);
getPopupPanel().setShowWhenRendered(true);
return null;
}