2016-11-22 2 views
1

Also hier ist die Sache. Ich habe ein Popup, das eine Schaltfläche hat, die Schaltfläche selbst hat einen fileDownloadActionListener, dieser ist verantwortlich für das Herunterladen einer Excel-Datei. Was ich also im Grunde brauche ist, das Popup direkt nach dem Generieren der Datei zu verstecken.Oracle ADF: Popup nach dem Herunterladen der Datei zu schließen

Hier ist meine .jspx-Datei (nur das Popup)

<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> 

Und hier ist die Java-Methode:

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(); 
    } 

} 

PROBLEM

Das Popup-Fenster wird nicht verbergen.

NOTES

  1. Das Popup wird in der Bohne
  2. ich diesen Code besitzen nicht richtig binded und ich bin eine Wartung zu tun.
  3. Ich weiß nicht, warum der Programmierer System.gc() verwendet, da ich es als eine schlechte Praxis betrachte. Here's a good reason

Antwort

1

hatte ich das gleiche Problem nach dem Herunterladen einer Datei, sollten Sie dies versuchen:

einen Ressourcentyp jav Verwenden ascript ein Ereignis Klick in command auslösen

<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> 

Sie sollten die folgenden Tasten haben:

<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> 

Dies ist die Java-Methode, mit der Schaltfläche aufgerufen:

public void prepareForDownloadAction(ActionEvent act) { 

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

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

Die versteckte Taste ist ausgelöst mit Javascript eine ADF-Methoden, die Magie passieren in der SetTimeout, Bei der Ausführung dieser Funktion vermeiden wir für eine Sekunde zu übermitteln, aber die Anfrage reist auf den Server, hier können wir ob Dienen wie die Datei gestartet wird.

1

Im Idealfall sollte this.myPopUp.hide(); das Popup schließen, aber wenn es aus irgendeinem Grund nicht funktioniert, können Sie versuchen, die Pop-up schließen mit Javascript wie:

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()); 
    } 
} 

Sie das Popup-clientId erhalten können, die Sie weitergeben können in hidePopup mit: this.myPopUp.getClientId(FacesContext.getCurrentInstance());

+0

Ist es org.apache.myfaces.trinidad.util.Service? – ggderas

+0

ja es ist org.apache.myfaces.trinidad.util.Service – amishra

+0

Es scheint nicht zu funktionieren. Die popup.getCientID() gibt etwas anderes zurück als das tatsächlich gerenderte HTML. Das tatsächlich gerenderte HTML hat :: content nach dem popupID. So oder so, versuche ich mit beiden und immer noch keine Antwort – ggderas

Verwandte Themen