Страница не обновляется после вызова ajax - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть пользовательский компонент (то есть файл xhtml с ui: состав внутри), где у меня есть поле загрузки файла. Когда файл выбран, он загружается через AJAX, как это

<uc:fileUpload
  id="#{id}fileUploadComponent"
  idSuffix="#{id}fileUploadSuffix"
  value="#{fileUpload.docsFilePart}"
  accept="#{fieldWrapper.acceptedFileTypes}"
  widgetVar="#{id}documentUploadWidget"
  nullAllowed="#{!((fieldDef.mandatory and 
  fieldWrapper.getCurrentFileCount() lt 1) and isSaving)}"
  maxSize="#{customField.maxFileSize}" >                                     
  <f:ajax listener="#{fileUpload.uploadNewFile(fieldWrapper)}" render="#{localId}fileUploadMain messages"/>
</uc:fileUpload>

Ниже этой загрузки есть <div> с тем же идентификатором, который указан в атрибуте render вызова ajax, где отображаются ссылки для загрузки файлов. То, что происходит, странно - после того, как файл выбран, он загружен, <div> корректно обновляется со ссылкой на недавно загруженный файл. Однако, когда я нажимаю «Отмена» или «Сохранить» на странице, вызываются соответствующие действия, в браузер возвращается правильный ответ (со статусом 200), но браузер, кажется, игнорирует его - страница визуально не обновляется или что-то еще ...

Пользовательский компонент представляет собой довольно большой кусок кода с не так-то простой в переписывании логикой, поэтому заменить его на этом этапе будет ... сложно ...

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

Я не могу понять, что именно происходит, тем более, почему, и я буду признателен за любые идеи!

Для чего я стою, я использую Mojarra на Wildfly 11 (ту, что предоставлена ​​AS)

1 Ответ

0 голосов
/ 12 апреля 2019

Как выясняется, причина в том, что загрузка файла через JSF AJAX вызывает создание iframe с именем "JSFFrameId" и этот фрейм устанавливается как цель формы вложенности.После выполнения AJAX-запроса цель не удаляется / не очищается, что приводит к тому, что ответы попадают в этот iframe и нарушает представление.На данный момент я не уверен, что является причиной этого, но обходной путь для меня должен иметь onevent в определении <f:ajax>, который очищает цель формы, как это:

<f:ajax 
  listener="#{fileUpload.uploadNewFile(fieldWrapper)}"
  onevent="function(e){if (e.status == 'complete') { $(e.source).parents('form').attr('target','');}"
  render="#{localId}fileUploadMain messages">

Я проверюс какими другими состояниями может потребоваться обработка, но в основном это решает проблему.Может быть полезно, если кто-то поделится своими подозрениями о том, что, возможно, заставило JSF оставить этот iframe и не сбросить цель формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...