2012-01-16 14 views
0

私はp:fileUploadがうまく動作します。しかし、新しいファイルがアップロードされた後、p:datatableの部分ページレンダリングが必要です。データテーブルには現在のファイルが表示されます。Primefaces datatable部分ページレンダリングが<p:fileUpload>と動作しません

これは奇妙なことですが、1つのファイルをアップロードすると、テーブルが再レンダリングされ、1つのレコードが表示されます。しかし、テーブルが再レンダリングされない2回目は、コードには2つのエントリがあることが示されています。これは私の心を吹いている、私は一日を費やしてこの作業をしようとしている。現時点では、私はui:repeatを使用した回避策があります。ここで

は、コードBeanコードをバックアップ

<h:outputLabel value="Files Upload" style="font-weight: bold;" /> 
    <p:fieldset> 

     <p:fileUpload id="iconUpload" update="@form" 
     fileUploadListener="#{appCreateController.processUpload}" 
     image="/resources/gfx/file_browse_normal.png" 
     allowTypes="*.jpg;*.png;*.gif;*.doc;*.exe;*.msi" 
     description="Icon"> 
     </p:fileUpload> 

    </p:fieldset> 
    <p:message for="iconUpload" /> 

    <p:dataTable var="appFile" id="appFiles" 
    value="#{appCreateController.uploadedFiles}" rows="10"> 
    <p:column> 
    <f:facet name="header"> 
    <h:outputText value="Name" /> 
    </f:facet> 
     <h:outputText value="#{appFile.uploadedFile.fileName}" /> 
    </p:column> 
     <p:column> 
    <f:facet name="header"> 
    <h:outputText value="Content Type" /> 
    </f:facet> 
    <h:outputText value="#{appFile.uploadedFile.contentType}" /> 
    </p:column> 
    <p:column> 
    <f:facet name="header"> 
    <h:outputText value="File Type" /> 
    </f:facet> 
    <h:selectOneMenu value="#{appFile.uploadedFileType}" id="fileType"> 
    <f:selectItems var="uploadedFileType" 
      value="#{appCreateController.uploadedFileTypes}" 
     itemLabel="#{uploadedFileType.name}" /> 
     </h:selectOneMenu> 
    </p:column> 
    <p:column> 
     <f:facet name="header"> 
    <h:outputText value="Size" /> 
    </f:facet> 
    <h:outputText value="#{appFile.size}" /> 
    </p:column> 
    </p:dataTable> 

は次のとおりです。

public void processUpload(FileUploadEvent event) 
      throws AbortProcessingException { 

     log.debug("Uploading file: " + event.getFile().getFileName()); 

     UploadedFileVO uploadedFileVO = new UploadedFileVO(); 
     uploadedFileVO.setUploadedFile(event.getFile()); 

     uploadedFiles.add(uploadedFileVO); 

     log.debug("Uploaded file: " + event.getFile().getFileName()); 

     log.debug("file list now contains file : " + uploadedFiles.size()); 
    } 

    public List<UploadedFileVO> getUploadedFiles() { 

     log.debug("Getting uploadedFiles. Total == " + uploadedFiles.size()); 

    return uploadedFiles; 
    } 


    public UploadedFileType[] getUploadedFileTypes() { 
    return UploadedFileType.values(); 
    } 

ホープ誰もが解決策:)私が試した

乾杯、OK コーエン

+0

おそらく 'update = @ form'を使う代わりに' update = [formid]:appFiles'を使うことができます。また、私はUploadedFileVOがPrimefacesのアップロードされたファイルの単純なラッパーであると仮定します。このように割り当てることで、すべてのラッパーオブジェクトが実際に同じアップロードされたファイルを指している可能性があります。ラッパーの 'equals'と' hashCode'をオーバーライドし、 'uploadedFiles'が集合コレクションである場合、両方のファイルが等しいとみなし、コレクション内のファイルのみを保持することができます。 –

+0

... JSFのどのバージョンと実装を使用していますか、どのバージョンのPrimefaceを使用していますか? –

+0

OK、2.2.1で試してみましたが、3.0.1にアップグレードしました。今は修正されています。私はxhtmlページの前にgetUploadedFiles()という別のメソッドがありましたが、何とかこれがデータテーブルの再作成に影響を与えました。 –

答えて

1

を、知っています2.2.1にアップグレードし、この問題を3.0.1にアップグレードしました。それでも問題は3.0.1で発生しましたが、現在修正されています。

明らかに、JSFエンジンは、getterがバッキングBeanの別のメソッドを介してすでに呼び出されているため、データテーブルの内容が変更されたことを確認できませんでした。

xhtmlページの前にgetUploadedFiles()という別のメソッドがありましたが、何とかこれがデータテーブルの再配置に影響しました。

関連する問題