ADF 弹出窗口取消侦听器在关闭对话框时未调用错误值

ADF popup cancel listener not invoked on closing dialog with error values

问题是当我在对话框组件的 inputBox 中输入一些负值时,验证器抛出类似 "Negative numbers not allowed" 的错误。该对话框现在有一个标有红色边框的错误输入框,我决定在对话框外部单击以关闭它并重置输入框,但 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>

bean代码:

    public void handleResetPopup(PopupCanceledEvent popupCanceledEvent) {
    try {
        UIComponent component = popupCanceledEvent.getComponent();
        RichInputText inputText = (RichInputText)JSFUtil.findComponent(component, "input1");
        inputText.resetValue();
    } catch (Throwable th) {
        this.handleException(th);
    }
}

问题:在对话框外部单击以关闭它并重置输入框时,未调用 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> ]]>

这样你总能正确处理来自客户端的弹窗关闭事件。并实现您需要的所有服务器逻辑。

此 link https://community.oracle.com/thread/4112016 中提供的解决方案适用于我的方案。