如何从 ICEfaces 模式弹出窗口调用托管 bean?
How do I invoke managed bean from an ICEfaces modal popup?
我正在使用 Eclipse Luna EE、Tomcat v7.0 和 ICEFaces 3.2
我有一个用于标签打印的表单,用户可以在其中输入项目编号、项目名称和标签类型等信息。然后用户提交表单。这会将信息以 ZPL 字符串的形式发送到标签打印机,然后打印出该项目的正确标签。这一切都没有问题。
如果值较高(生产中超过 100 个),该表格会根据打印数量进行检查。如果打印数量超过某个值(> 2。纯粹用于测试目的),则 "testFlag" 布尔值设置为真,显示模式框并设置错误标志,以便打印命令不会执行。
模态框询问用户是否输入了正确的数量,并提供 Yes/No 个按钮。
printUI 和模态弹出窗口在同一个 <ice:form>
元素内,如果 testFlag 设置为 true,则弹出框呈现并可见。
问题:
当我单击模式框中的 "Yes" 按钮时,它没有执行我分配给它的操作 (System.out.println("Yes Button!")
)。模态框关闭,没有任何反应。
然后我可以重新提交表单,模态框再次出现,然后我单击 "Yes" 没有任何反应。
如果我把数量改成2再提交,那么执行打印命令没问题。
我猜测这是会话处理方式的问题。
问题:
如何让模态框上的 "Yes" 按钮执行我想要的代码?
我试过了:
使用 <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!");
}
我找到了替代方案。
我已经删除了模态弹出窗口和所有与之相关的代码。
我在表格末尾添加了 <ice:panelConfirmation>
。仅当打印数量高于我设置的数字时才会呈现。
我通过在我的打印数量 <h:inputText>
上使用 valueChangeListener="#{validateBean.printQtyChange}"
和 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 模式弹出窗口调用托管 bean 的方法,那也很棒。
更新
我已将所有 <h:inputText>
更改为 <ice:inputText>
并将 partialsubmit="true"
添加到我的数量输入字段。通过添加这个我已经能够删除 onblur="submit()"
NEW打印数量输入文字:
<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"
以防止执行不必要的代码。只在我要检查的输入字段上显示它更整洁。
我正在使用 Eclipse Luna EE、Tomcat v7.0 和 ICEFaces 3.2
我有一个用于标签打印的表单,用户可以在其中输入项目编号、项目名称和标签类型等信息。然后用户提交表单。这会将信息以 ZPL 字符串的形式发送到标签打印机,然后打印出该项目的正确标签。这一切都没有问题。
如果值较高(生产中超过 100 个),该表格会根据打印数量进行检查。如果打印数量超过某个值(> 2。纯粹用于测试目的),则 "testFlag" 布尔值设置为真,显示模式框并设置错误标志,以便打印命令不会执行。
模态框询问用户是否输入了正确的数量,并提供 Yes/No 个按钮。
printUI 和模态弹出窗口在同一个 <ice:form>
元素内,如果 testFlag 设置为 true,则弹出框呈现并可见。
问题:
当我单击模式框中的 "Yes" 按钮时,它没有执行我分配给它的操作 (System.out.println("Yes Button!")
)。模态框关闭,没有任何反应。
然后我可以重新提交表单,模态框再次出现,然后我单击 "Yes" 没有任何反应。
如果我把数量改成2再提交,那么执行打印命令没问题。
我猜测这是会话处理方式的问题。
问题: 如何让模态框上的 "Yes" 按钮执行我想要的代码?
我试过了:
使用 <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!");
}
我找到了替代方案。
我已经删除了模态弹出窗口和所有与之相关的代码。
我在表格末尾添加了 <ice:panelConfirmation>
。仅当打印数量高于我设置的数字时才会呈现。
我通过在我的打印数量 <h:inputText>
上使用 valueChangeListener="#{validateBean.printQtyChange}"
和 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 模式弹出窗口调用托管 bean 的方法,那也很棒。
更新
我已将所有 <h:inputText>
更改为 <ice:inputText>
并将 partialsubmit="true"
添加到我的数量输入字段。通过添加这个我已经能够删除 onblur="submit()"
NEW打印数量输入文字:
<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"
以防止执行不必要的代码。只在我要检查的输入字段上显示它更整洁。