Oracle ADF: закрыть всплывающее окно после загрузки файла

Так вот в чем дело. У меня есть всплывающее окно, в котором есть кнопка, в самой кнопке есть файл DownloadActionListener, этот отвечает за загрузку файла excel. Так что в основном мне нужно скрыть всплывающее окно сразу после создания файла.

Вот мой файл .jspx (просто всплывающее окно)

    <af:popup childCreation="deferred" autoCancel="enabled"
              id="myPopUp"
              contentDelivery="lazyUncached"
              binding="#{viewScope.mbMyBean.myPopUp}"
              partialTriggers="b17">
        <af:dialog id="d16" type="cancel"
                   title="Do you wish to download a file?"
                   inlineStyle="width:400px;">
            <af:panelGroupLayout id="pgl32"
                                 inlineStyle="max-width: 200px;">
            <af:outputText value="You're about to download a file. Ready?" id="ot45"
                               />
            </af:panelGroupLayout>
            <f:facet name="buttonBar">
                <af:button text="GO" id="b17"
                    <af:fileDownloadActionListener contentType="excelHTML"
                                                   filename="#{viewScope.mbMyBean.FileName}"
                                                   method="#{viewScope.mbMyBean.GenerateEmptyExcel}"
                                                   />
                </af:button>
            </f:facet>
        </af:dialog>
    </af:popup>

И вот java-метод:

public void GenerateEmptyExcel(FacesContext facesContext, OutputStream outputStream) {

    try {


        HSSFWorkbook wb1 = generateEmptyExcelFile();
        wb1.write(outputStream);


        outputStream.flush();
        outputStream.close();

        this.myPopUp.hide();

        AdfFacesContext.getCurrentInstance().addPartialTarget(this.myPopUp);

        System.gc();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

ПРОБЛЕМА

Всплывающее окно не скроется.

ПРИМЕЧАНИЯ

  1. Всплывающее окно правильно привязано к компоненту
  2. У меня нет этого кода, и я занимаюсь его обслуживанием.
  3. Я не знаю, почему программист использовал System.gc(), так как считаю это плохой практикой. Вот веская причина

person ggderas    schedule 22.11.2016    source источник


Ответы (2)


У меня была такая же проблема после загрузки файла, вы должны попробовать это:

Используйте javascript типа ресурса, чтобы инициировать щелчок по событию в commandButton

<af:resource type="javascript">              

          function customHandler(evt) {
              console.log(evt);

              var exportCmd = AdfPage.PAGE.findComponentByAbsoluteId("pt1:b17");
              console.log(exportCmd);
              var actionEvent = new AdfActionEvent(exportCmd);
              console.log(actionEvent);
              actionEvent.forceFullSubmit();
              actionEvent.noResponseExpected();
              actionEvent.queue(false);

              setTimeout(function(){hidePopup();}, 1000);    


          }                                    

          function hidePopup() {

              var popup = AdfPage.PAGE.findComponent("pt1:popupAceptarDescargarPlantilla::content");

              popup.hide();

          }

        </af:resource>

У вас должны получиться следующие кнопки:

<af:commandButton text="Aceptar" id="b17" visible="false" clientComponent="true" partialSubmit="true">
                                                                        <af:fileDownloadActionListener contentType="excelHTML" filename="#{viewScope.mbGestionArchivos.nombre_archivo}" method="#{viewScope.mbGestionArchivos.generateExcelVacio}"/>
                                                                    </af:commandButton>
                                                                    <af:button text="Aceptar" id="botonPrueba" actionListener="#{viewScope.mbInformeDetalle.prepareForDownloadAction}" clientComponent="true" partialSubmit="true"></af:button>

Это метод Java, вызываемый кнопкой:

    public void prepareForDownloadAction(ActionEvent act) {

    FacesContext context = FacesContext.getCurrentInstance();
    ExtendedRenderKitService erks =
    Service.getService(context.getRenderKit(),
           ExtendedRenderKitService.class);

    erks.addScript(context, "customHandler();");
    }

Скрытая кнопка запускается с помощью методов javascript и ADF, волшебство происходит в setTimeout. При выполнении этой функции мы на секунду избегаем отправки, но запрос отправляется на сервер, здесь мы можем наблюдать, как файл запускается.

person csuazo    schedule 17.01.2017

В идеале this.myPopUp.hide(); должно закрыть всплывающее окно, но если оно по какой-то причине не работает, вы можете попробовать закрыть всплывающее окно с помощью javascript, например:

public static void hidePopup(String popupId){
   if (popupId != null)
   {
     ExtendedRenderKitService service =
       Service.getRenderKitService(FacesContext.getCurrentInstance(),
                                   ExtendedRenderKitService.class);    
     StringBuffer hidePopup = new StringBuffer();             
      hidePopup.append("var popupObj=AdfPage.PAGE.findComponent('" + popupId +
       "'); popupObj.hide();");
     service.addScript(FacesContext.getCurrentInstance(), hidePopup.toString());
   }
 }

Вы можете получить clientId всплывающего окна, который вы можете передать в hidePopup, используя: this.myPopUp.getClientId(FacesContext.getCurrentInstance());

person amishra    schedule 23.11.2016
comment
Это org.apache.myfaces.trinidad.util.Service? - person ggderas; 23.11.2016
comment
Кажется, это не работает. popup.getCientID() возвращает что-то отличное от фактического отображаемого HTML. Фактически отображаемый html имеет ::content после popupID. В любом случае, я пытаюсь с обоими и до сих пор нет ответа - person ggderas; 23.11.2016
comment
Вы установили clientComponent=true для всплывающего окна? Это необходимо для доступа к всплывающим окнам в javascript. - person amishra; 23.11.2016
comment
Еще одна вещь, которую нужно проверить, это код для создания файла excel . Это может привести к сбою, и, следовательно, код для скрытия всплывающего окна никогда не будет выполнен. Попробуйте прокомментировать эту часть кода и посмотреть, не можете ли вы по-прежнему скрыть всплывающее окно. - person amishra; 24.11.2016
comment
Я пробовал обе вещи и просто не могу заставить их работать. Может ли это быть связано с браузером? - person ggderas; 24.11.2016
comment
Может быть, какой у вас браузер? Кроме того, убедитесь, что ваша страница/фрагмент страницы, содержащий всплывающее окно, не имеет ошибок (красных или даже оранжевых цветовых маркеров). - person amishra; 24.11.2016