2012-01-16 2 views
0

У меня есть p: fileUpload, который отлично работает. Но мне нужно частичное отображение страницы p: datatable после того, как был загружен новый файл. В файле datatable отображаются текущие файлы.Прямолинейный частичный рендеринг страниц не работает с <p: fileUpload>

Странно, что, как только я загружу один файл, таблица перезаписана, показывая одну запись. Но во второй раз, когда таблица не перезагружена, ПОКАЗЫВАЕТ, что код показывает 2 записи. Это раздувает мой разум, я потратил весь день, пытаясь заставить это работать. На данный момент у меня есть обходной путь с использованием ui: repeat.

Вот код

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

Надежда кто-нибудь знает решение :)

Приветствия, Коэнов

+0

Возможно, вместо использования 'update = @ form' вы можете использовать' update = [formid]: appFiles'. Также я предполагаю, что UploadedFileVO - простая оболочка для загруженного файла Primefaces. Назначая его таким образом, возможно, что все ваши объекты-обертки могут фактически указывать на один и тот же загруженный файл. Если вы переопределили 'equals' и' hashCode' для вашей обертки, а 'uploadedFiles' - это наборная коллекция, тогда он может считать оба файла равными и сохранить только один в коллекции. –

+0

... а также какую версию и реализацию JSF вы используете и какую версию Prime? –

+0

Хорошо, я пробовал с 2.2.1 и обновил эту проблему до 3.0.1. Теперь это исправлено. У меня был другой метод, который, в свою очередь, назывался getUploadedFiles() до того, как страница xhtml сделала это, это повлияло на перенаселение данных. –

ответ

1

ОК, я попытался с 2.2.1 и обновлен для этой проблемы до версии 3.0.1. Проблема все еще возникала с 3.0.1, но теперь она исправлена.

Очевидно, что JSF-движок не видел, что содержимое данных изменялось, потому что геттер уже был вызван другим методом в бэкэнде.

У меня был другой метод, который, в свою очередь, назывался getUploadedFiles() до того, как страница xhtml сделала это, это как-то повлияло на повторное заселение datatable.

Смежные вопросы