2013-04-01 27 views
8

Sto usando Primefaces TabView, CommandButton e FileDownload per scaricare un file di registro. Una volta scaricato il file di registro, desidero offrire l'opzione per eliminare il contenuto del registro dal server.Aggiornamento componente dopo il download del file

Inizialmente il pulsante Elimina file di registro (deleteEventLogButton) è disabilitato e presenta una didascalia personalizzata che indica "Elimina registri - Esportazione richiesta". Una volta esportato il registro, il pulsante dovrebbe essere abilitato e la didascalia dovrebbe indicare "Elimina registri".

Il problema che si verifica è che il pulsante Elimina file di registro è ancora disabilitato e la didascalia riporta "Elimina registri - Esportazione richiesta" anche dopo che l'evento di esportazione è stato completato correttamente.

La mia ipotesi è che exportEventLogButton-> Update = "deleteEventLogButton" venga chiamato prima del valore fileDownload.

Una volta esportati i registri, posso premere "F5" e aggiornare la pagina e deleteEventLogButton è abilitato mostrando la didascalia corretta.

JSF - Snippet

<p:tabView id="logView"> 
    <p:tab id="eventLogTab" title="Security Events"> 
     <p:panelGrid ...> 

      <p:commandButton id="exportEventLogButton" icon="ui-icon-disk" styleClass="c25" ajax="false" title="Export Log" disabled="#{empty managedCmsLogsBean.eventLogEntityList}" update="deleteEventLogButton"> 
       <p:fileDownload value="#{managedCmsLogsBean.exportEventLogFiles()}"/> 
      </p:commandButton> 

      <p:commandButton id="deleteEventLogButton" icon="ui-icon-trash" styleClass="c25" ajax="false" title="#{managedCmsLogsBean.deleteEventLogCaption}" disabled="#{! managedCmsLogsBean.eventLogExported}" action="#{managedCmsLogsBean.clearEventLogs()}" update="eventLogTab" />  

     </p:panelGrid> 

     <p:dataTable value="#{managedCmsLogsBean.eventLogEntityList}" ...> 
      ... 
     </p:dataTable> 

    </p:tab> 
</p:tabView> 

Backing Bean - Snippet

private boolean eventLogExported; 

public StreamedContent exportEventLogFiles() { 
    eventLogExported = true; 
    return logFileUtility.exportSecurityEventLog(eventLogEntityList, eventLogStartDate, eventLogStopDate); 
} 

public boolean isEventLogExported() { 
    return eventLogExported; 
} 

public void setEventLogExported(boolean value) { 
    eventLogExported = value; 
} 

public String getDeleteEventLogCaption() { 
    return eventLogExported ? "Delete Logs" : "Delete Logs - Export Required"; 
} 

ho provato spostando l'evento di aggiornamento all'interno del FileDownload, ma non ha fatto la differenza.

<p:commandButton id="exportEventLogButton" icon="ui-icon-disk" styleClass="c25" ajax="false" title="Export Log" disabled="#{empty managedCmsLogsBean.eventLogEntityList}"> 
    <p:fileDownload value="#{managedCmsLogsBean.exportEventLogFiles()}"> 
     <p:ajax update="deleteEventLogButton"/> 
    </p:fileDownload> 
</p:commandButton> 

Ho cercato per un paio di giorni e ho trovato molti problemi che vengono molto vicino a questo ... ma nessuno che abbia aiutato. :(

Giusto per rendere le cose molto chiare ... non sto avendo problemi con l'esportazione. Il problema è che il pulsante Elimina file di registro non è abilitato, dopo l'esportazione è completa.

risposta

22

p:commandButton nel tuo caso è (una deve essere) pulsante non AJAX (è possibile impostare questo con l'aggiunta di attributo ajax="false"). in questo caso update attributo e p:ajax tag non lo fa ha senso (come lo sono solo per le richieste AJAX). Quando si scarica il file l'applicazione invia lo streaming di qualche tipo, e vedi la finestra di dialogo Salva file. La tua pagina non è aggiornata. Quindi, è necessario utilizzare PrimeFaces.monitorDownload per fare questo:

<p:commandButton id="exportEventLogButton" 
       icon="ui-icon-disk" 
       styleClass="c25" 
       ajax="false" 
       title="Export Log" 
       disabled="#{empty managedCmsLogsBean.eventLogEntityList}" 
       onclick="PrimeFaces.monitorDownload(null, stop)"> 

e aggiungere la funzione di arresto che aggiornerà secondo pulsante:

<p:remoteCommand name="stop" update="deleteEventLogButton"/> 
+1

Brillante! Questo ha funzionato magnificamente. Adoro questo sito ... ed è per gente come te! – AceFunk

+0

Come sei nuovo, se questo ti ha aiutato dovresti accettare una risposta – partlov

+0

Ha funzionato! Grazie. –

1

Avete provato a cambiare eventLogExported/isEventLogExported da booleano a booleano o stringa?

+0

Ora ho ... ma non ha fatto alcuna differenza. Grazie per il suggerimento però. – AceFunk

1

Come Balusc rispose: In question (revisions), non possiamo ottenere la risposta due volte da una singola richiesta, per aggiornare una pagina dopo il download, meglio usare il seguente script java nel tag link di download (p: commandbutton) onclick.

Esempio:

<p:commandButton ajax="false" icon="ui-icon-arrowstop-1-s" onclick="setTimeout('location.reload();', 1000);" action="#{managedBean.downloadMethod}" /> 

questo aggiornare automaticamente la pagina dopo 1 secondo, allo stesso tempo cioèprima dell'aggiornamento, otterrai il file di download, in base al tempo di risposta del download, aumentando i secondi in quello script. I secondi non devono essere inferiori al tempo di risposta del download.

Problemi correlati