Jsf 关闭带有错误值的对话框时未调用ADF弹出取消侦听器

Jsf 关闭带有错误值的对话框时未调用ADF弹出取消侦听器,jsf,richfaces,oracle-adf,Jsf,Richfaces,Oracle Adf,问题是当我在对话框组件的输入框中输入一些负值时,验证器抛出类似“不允许使用负数”的错误。该对话框现在有一个标有红色边框的错误输入框,我决定在对话框外部单击以关闭它并重置输入框,但inputBox不会重置,如果我按Esc键或Ok按钮,则只调用popupCanceledListener并重置inputBox。下面是代码,其中包含一个带有对话框和输入框的弹出窗口 JSF代码: <af:popup contentDelivery="lazyUncached" autoCancel="enabled

问题是当我在对话框组件的输入框中输入一些负值时,验证器抛出类似“不允许使用负数”的错误。该对话框现在有一个标有红色边框的错误输入框,我决定在对话框外部单击以关闭它并重置输入框,但inputBox不会重置,如果我按Esc键或Ok按钮,则只调用popupCanceledListener并重置inputBox。下面是代码,其中包含一个带有对话框和输入框的弹出窗口

JSF代码:

<af:popup contentDelivery="lazyUncached" autoCancel="enabled"
          popupCanceledListener="#{pageFlowScope.testBean.handleResetPopup}"
          childCreation="deferred" id="testPopup">
   <af:dialog type="none" modal="false"
     id="Dlg1">
     <af:inputText label="DECIMAL PLACES"
                    columns="2"
                    validator="#{pageFlowScope.testBean.validateDecimalPlaceValue}"
                    value="#{pageFlowScope.testBean.decimalPlace}"
                    id="input1" autoSubmit="true"></af:inputText>
    <f:facet name="acceptNFChange">
      <af:commandButton text="OK" id="cb1"
                        actionListener="#{pageFlowScope.testBean.handleOkFromPopup}"
                        partialSubmit="true"></af:commandButton>
    </f:facet>
  </af:dialog>
</af:popup>

问题:在对话框外部单击以关闭对话框并重置输入框时,不会调用popupCanceledListener。

最好的方法是使用类型为popupClosed的客户端侦听器。下面是您的代码示例:

<af:popup contentDelivery="lazyUncached" autoCancel="enabled"
          popupCanceledListener="#{pageFlowScope.testBean.handleResetPopup}"
          childCreation="deferred" id="testPopup">
   <af:dialog type="none" modal="false"
     id="Dlg1">
     <af:inputText label="DECIMAL PLACES"
                    columns="2"
                    validator="#{pageFlowScope.testBean.validateDecimalPlaceValue}"
                    value="#{pageFlowScope.testBean.decimalPlace}"
                    id="input1" autoSubmit="true"></af:inputText>
    <f:facet name="acceptNFChange">
      <af:commandButton text="OK" id="cb1"
                        actionListener="#{pageFlowScope.testBean.handleOkFromPopup}"
                        partialSubmit="true"></af:commandButton>
    </f:facet>
  </af:dialog>
  <af:clientListener type="popupClosed" method="popupCloseClientListener"/> 
  <af:serverListener type="popupClosedEvent" method="#{pageFlowScope.testBean.handlePopupClosed}"/>
</af:popup>

然后您需要在JSF脚本的某个地方编写:

<script>
    function popupCloseClientListener(event) {
       component = event.getSource();
       AdfCustomEvent.queue(component,
                            "popupClosedEvent",
                            {payload:component.getSubmittedValue()},
                            true);
       event.cancel();
 }
 </script> ]]>

函数popupCloseClientListener(事件){
component=event.getSource();
ADFCustomeEvent.queue(组件,
“popupClosedEvent”,
{payload:component.getSubmittedValue()},
正确的);
event.cancel();
}
]]>

通过这种方式,您可以始终正确地处理来自客户端的弹出关闭事件。并实现您所需的所有服务器逻辑。

此链接中提供的解决方案对我的场景很好。

您可以调查自动取消属性是否影响此操作。将自动取消属性更改为disabled,并且似乎不影响它。您的bean方法名称与JSF方法调用不匹配。@32U。。这是一个拼写错误。另一种方法是:在decimalPlace的backingbean中的setter中,不使用validator,而是在那里进行验证。如果出现问题,请弹出您自己的弹出窗口或在当前弹出窗口中显示错误文本,并像在handleResetPopup方法中一样清除输入文本。您是否尝试在对话框外部单击以关闭它,并查看是否调用了handlePopupClosed方法?,,我已更新了问题的更多详细信息。看一看,然后尝试你发布的相同代码。你提供的代码对我不起作用。
<script>
    function popupCloseClientListener(event) {
       component = event.getSource();
       AdfCustomEvent.queue(component,
                            "popupClosedEvent",
                            {payload:component.getSubmittedValue()},
                            true);
       event.cancel();
 }
 </script> ]]>