2015-09-15 24 views
6

sağlamak CRUD uygulama üzerinde çalışıyorum ve veri veritabanından csv dosyasına vermem gerekiyor. Ben dosyası oluşturmak çağrılan yöntemdeKoşullu olarak dosya indirme veya verme doğrulama doğrulama iletisi

<p:commandButton value="Export" ajax="false" action="myController.export"/> 

ve OmniFaces yarar yöntemi ile indirmek:

Faces.sendFile(file, true); 
ihracat için, aşağıdaki kodda gösterildiği şekilde, ajax devre dışı zorunda kaldı aynı yöntemi kullanarak

, aslında herhangi bir veri olup olmadığını kontrol edin ve herhangi bir veri, uyarı iletişim gösterilmektedir değil söz konusuysa:

RequestContext.getCurrentInstance().showMessageInDialog(new FacesMessage(FacesMessage.SEVERITY_WARN, "Warning!", "No available data for export.")); 

Şimdi, bütün bunlar eser olarak yapar iken amaçlanan sorun, ajax'ın devre dışı bırakılmasından dolayı iletişimin dinamik olarak gösterilememesi ve sayfanın yeniden yüklenmesidir. Ajax etkinse, iletişim dinamik olarak gösterilir, ancak dosya indirme işlemi başlamaz.

Monitor download numaralı telefonu kullanarak veya ikinci bir düğmeye basarak bu soruna geçici bir çözüm bulmaya çalışıyorum, ancak şu ana kadar bu konuda herhangi bir ilerleme kaydetmedim.

Böyle bir sorunu çözmek için genel olarak kabul edilebilir bir yol var mı?

cevap

8

Böyle bir sorunu çözmek için genel olarak kabul edilebilir bir yol var mı?

Temelde başarılı olursa ilk ve onComplete kontrol altında bir ajax isteği yangın ve ardından dosyayı indirmek için bir senkron isteği tetiklemek istiyorum (not ajax ile size can't indirme dosyaları gibi). oncomplete işlev bağlamında PrimeFaces uygulamasının args nesnesine enjekte ettiği geçerlilik hatası durumunu işaretlemek için FacesContext#validationFailed() (veya OmniFaces Faces.validationFailed()) 'dan faydalanabilirsiniz (ajax devre dışı bırakıldığında oncomplete gibi ajax ile ilgili özniteliklerin çalışmaz). Böyle

şey:

<p:commandButton 
    value="Export" 
    action="#{bean.export}" 
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('download').jq.click()" /> 
<p:commandButton 
    widgetVar="download" 
    styleClass="ui-helper-hidden" 
    action="#{bean.download}" ajax="false" /> 
public void export() { 
    // Prepare file locally. 

    if (fail) { 
     // Show message your way and then set validation failed as below. 
     Faces.validationFailed(); 
    } 
} 

public void download() throws IOException { 
    Faces.sendFile(file, true); 

    // Delete local file afterwards? 
} 

Not gizli <p:commandButton>ajax="false" desteklemediği ikincisi olarak yerine <p:remoteCommand> ait kullanıldığını.