2013-07-16 65 views
1

我有這樣的結構:p:fileDownload中的Primefaces p:treeTable不起作用?

<p:treeTable value="#{cmpDocumentTree.root}" var="v" id="#{tableId}" selectionMode="single" 
     selection="#{cmpDocumentTree.selectedNode}"> 
     <p:ajax event="expand" listener="#{cmpDocumentTree.onNodeExpand}" /> 
     <p:ajax event="collapse" listener="#{cmpDocumentTree.onNodeCollapse}" /> 
     <p:ajax event="select" listener="#{crudBean.edit(cmpDocumentTree.selectedNode.data)}" 
      update=":#{formDialogUpdate}" oncomplete="#{formDialog}.show()" /> 
     <p:column headerText="Nazwa" sortBy="#{v.name}" style="min-width: 200px;"> 
      <h:outputText value="#{v.name}" /> 
     </p:column> 
     <p:column headerText="Pliki" width="300"> 
      <ui:repeat var="_file1" value="#{v.files}"> 
       <h:commandLink value="#{_file1.originalFilename}"> 
        <p:fileDownload 
         value="#{fileDownloadController.getFile(_file1.originalFilename, _file1.storedFilename, _file1.contentType)}" /> 
       </h:commandLink> 
       <br /> 
      </ui:repeat> 
     </p:column> 
</p:treeTable> 

但是 - P:fileDownload不起作用。 fileDownloadController.getFile(...)方法根本不被觸發。 當我在p:dataTable中放入同樣的方法時,它完美地工作。

編輯:

v.files來自ComDocument實體 - 這是一個關係到許多文件到文件。

@Entity 
@Table(name = "com_documents", schema = "public") 
@SequenceGenerator(name = "COM_DOCUMENTS_SEQ", sequenceName = "COM_DOCUMENTS_SEQ", allocationSize = 1) 
public class ComDocument implements EntityInt, java.io.Serializable { 
(...) 
@OneToMany(fetch = FetchType.EAGER, mappedBy = "document", cascade = CascadeType.ALL, orphanRemoval = true) 
private List<ComDocumentFile> files; 

public void setFiles(List<ComDocumentFile> files) { 
    this.files = files; 
} 

public List<ComDocumentFile> getFiles() { 
    return files; 
} 

你能幫幫我嗎?謝謝。

+0

'v.files'如何得到填充,即如何'v.getFiles'工作?,請在這裏顯示代碼 – kolossus

+0

@kolossus請看看更新的問題,謝謝 – robson

回答

3

我從來沒有任何運氣與FileDownload內工作的Ajax請求。我沒有深入挖掘源代碼,因爲它從來不是一個顯示器(並且將它用作ajax請求確實沒有意義 - 您正在獲取完整文件,而不是更新頁面)。

這裏簡單的解決方案是確保您的命令按鈕有「阿賈克斯=假」

<p:commandLink value="#{_file1.originalFilename}" ajax="false"> 
    <p:fileDownload 
    value="#{fileDownloadController.getFile(_file1.originalFilename, file1.storedFilename,  _file1.contentType)}" /> 
</p:commandLink> 

http://www.primefaces.org/showcase/ui/fileDownload.jsf

你會發現所有的例子都禁用了Ajax功能。如果您使用h:commandButton作爲樣式,我建議使用p:commandLink並將其設置爲按鈕樣式。

祝你好運,我敢肯定這會解決它。另外 - 確保你的「下載對象」是最終的。您需要確保數據源引用的是相同的引用,而不是在每個請求上創建新的實例。

+0

我試着用p:commandLink,p:commandButton ajax = false,但也沒有成功。奇怪的是,p:列中的相同結構,但在p:dataTable(不是p:treeTable)中工作正常。你是什​​麼意思 - 是最終的?用班級編號? – robson

+1

不,我的意思是「getFile」方法在調用時返回相同的引用,還是返回對新對象的引用?如果它在桌面上工作,很可能它是一個錯誤。你應該打開論壇並詢問 - 他們通常會很快回復。 –

+0

好吧,它確實看起來像一個錯誤。我已經在論壇上發過帖,但沒有任何迴應。我再次討論了這個話題。希望他們會幫助。謝謝。 – robson

相關問題