Как вызвать управляемый компонент из модального всплывающего окна ICEfaces?
Я использую Eclipse Luna EE, Tomcat v7.0 и ICEFaces 3.2
У меня есть форма для печати этикеток, в которую пользователь вводит такую информацию, как номер элемента, имя элемента и тип этикетки. Затем пользователь отправляет форму. Это отправляет информацию на принтер этикеток в виде строки ZPL, которая затем выводит правильную этикетку для элемента. Это все работает без проблем.
Форма проверяет количество отпечатков в случае высокого значения (более 100 при производстве). Если количество отпечатков превышает определенное значение (> 2. только для целей тестирования), тогда логическое значение "testFlag" устанавливается в значение "истина", отображается модальное поле и устанавливается флаг ошибки, чтобы команда печати не выполнялась.
Модальное поле спрашивает, правильно ли пользователь ввел количество, с доступными кнопками Да / Нет.
PrintUI и модальное всплывающее окно внутри <ice:form>
элемент с всплывающим окном, отображаемым и видимым, если для testFlag установлено значение true.
Проблема: Когда я нажимаю кнопку "Да" в модальном окне, он не выполняет назначенное ему действие (System.out.println("Yes Button!")
). Модальная коробка закрывается и ничего не происходит.
Затем я могу повторно отправить форму, и снова появляется модальное окно, затем я нажимаю "Да", и ничего не происходит.
Если я изменяю количество на 2 и отправляю, то он без проблем выполняет команду печати.
Я предполагаю, что это проблема с тем, как обрабатывается сессия.
Вопрос: Как получить кнопку "Да" на модальном поле, чтобы выполнить код, который я хочу?
Я пробовал: используя <ice:commandLink>
, <h:button>
, <h:commandButton>
, <h:commandLink>
Наличие модального всплывающего окна и формы в отдельности <ice:form>
теги (это обновило сеанс и удалило все введенные данные).
Используя actionListener
код, содержащий форму:
<h:body>
<div id="surround">
<ice:form id="test" prependId="false">
<ui:include src="./printUI.xhtml" />
<ui:include src="./printQtyPopup.xhtml" />
</ice:form>
</div>
</h:body>
printQtyPopup.xhtml
<ui:composition>
<ice:panelPopup modal="true" visible="#{validateBean.testFlag}" rendered="#{validateBean.testFlag}">
<f:facet name="header">
<ice:outputText value="Print Quantity Check" />
</f:facet>
<f:facet name="body">
<ice:panelGrid>
<ice:outputText value="You selected a print quantity of: #{validateBean.printAmount}" />
<ice:outputText value="Is this correct?" />
<ice:panelGroup>
<ice:commandButton value="No" />
<ice:commandButton value="Yes" action="#{validateBean.checkQtyYes}" />
</ice:panelGroup>
</ice:panelGrid>
</f:facet>
</ice:panelPopup>
</ui:composition>
Соответствующий код ValidateBean.java
public void validate() { //validation checks are carried out when the user clicks "Print" on the printUI.
if (!errorFlag && checkQty && printQty > 2) {
testFlag = true;
errorFlag = true;
System.out.println("Qty Check Modal");
}
if (!errorFlag) {
if (printQty > 0) {
initialiseString();
initialisePrinter();
clear();
} else {
printQty = 0;
errorMessage = true;
quantityInvalid = true;
errorFlag = true;
}
}
}
public void checkQtyYes() {
System.out.println("Yes Button!");
}
1 ответ
Я нашел альтернативу.
Я удалил модальное всплывающее окно и любой код, связанный с ним.
Я добавил в <ice:panelConfirmation>
в конце моей формы. Это отображается только в том случае, если количество отпечатков превышает указанное мной число.
Я получаю номер с помощью valueChangeListener="#{validateBean.printQtyChange}"
на моем количестве печати <h:inputText>
с onblur="submit()"
Я попробовал onchange="submit()"
но столкнулись с проблемами при отправке строки заданий на печать. Я должен был бы нажать "ENTER", чтобы вызвать onchange
Атрибут для активации, который, я уверен, пользователи не хотят.
<ice:panelConfirmation>
работает, приостановив отправку формы и ожидая ответа, прежде чем она либо продолжит, либо остановит отправку. Который завершает то, что я пытался достичь с помощью модального всплывающего окна.
Печатать количество вводимого текста:
<h:inputText id="printQty" value="#{validateBean.printAmount}" size="8" autocomplete="off"
maxlength="3" required="true" onblur="submit()"
valueChangeListener="#{validateBean.printQtyChange}" />
valueChangeListener:
public void printQtyChange(ValueChangeEvent e) {
printAmount = e.getNewValue().toString();
try {
ls.setPrintQty(Integer.parseInt(printAmount));
} catch (NumberFormatException eve) {
errorMessage = true;
quantityInvalid = true;
errorFlag = true;
}
printQty = ls.getPrintQty();
System.out.println("Qty : " +printQty);
if (printQty < 1) {
errorMessage = true;
quantityInvalid = true;
errorFlag = true;
}
}
Подтверждение панели: внутри <ice:form>
, Незадолго до закрытия формы
<ice:panelConfirmation id="confirmQty"
acceptLabel="Yes"
cancelLabel="No"
message="Your entered the quantity: #{validateBean.printQty}. Is this correct?"
title="Confirm Quantity"
draggable="false"
rendered="#{validateBean.printQty > 2}" />
Кнопка печати: связана с <ice:panelConfirmation>
<ice:commandButton styleClass="button" id="printButton" value="Print"
actionListener="#{validateBean.validate}" panelConfirmation="confirmQty" />
Если кто-нибудь знает способ вызова управляемого компонента из условного модального всплывающего окна ICEfaces, это было бы замечательно.
ОБНОВЛЕНИЕ Я с тех пор изменил все мои <h:inputText>
в <ice:inputText>
и добавил partialsubmit="true"
в мое поле ввода для количества. с добавлением этого я смог удалить onblur="submit()"
НОВЫЙ печатный текст для ввода количества:
<ice:inputText id="printQty" value="#{validateBean.printAmount}" size="8" autocomplete="off"
maxlength="3" required="true" valueChangeListener="#{validateBean.printQtyChange}"
partialSubmit="true" />
Это устранило проблему, из-за которой иногда возникали проблемы при отправке ряда заданий.
Я не положил partialsubmit="true"
на <ice:form>
потому что я должен был тогда объявить каждое другое поле ввода как partialsubmit="false"
чтобы предотвратить выполнение ненужного кода. Более аккуратно иметь его только в поле ввода, которое я хочу проверить.