Как установить свойство bean-компонента перед загрузкой файла с помощью rich: fileUpload? - PullRequest
0 голосов
/ 11 ноября 2010

Мое приложение имеет модальную панель, где пользователь может загружать файлы и выбирать «тип документа» в выпадающем списке.

Я использовал <f:setPropertyActionListener> для установки значения типа документа во время события загрузки, но иногда свойство устанавливается после загрузка была обработана. Вероятно, это происходит потому, что генерируется другой запрос, и этот запрос обрабатывается другим потоком веб-контейнера.

<rich:modalPanel id="attachFiles" autosized="true">
    <h:form id="formUpload" enctype="multipart/form-data">
        <h:selectOneMenu id="docType"  value="#{myMB.docType}" required="true" >
            <f:selectItems value="#{myMB.docTypesSelectItems}"  />
    </h:selectOneMenu>`
        <rich:fileUpload id="upload" fileUploadListener="#{myMB.handleUpload}">
            <a4j:support event="onupload">
                <f:setPropertyActionListener value="#{myMB.docType}" 
                    target="#{myMB.docType}" />
            </a4j:support>
        </rich:fileUpload>
</rich:modalPanel>

Когда это происходит, значение myMB.docType равно нулю во время выполнения myMB.handleUpload, что не ожидается, так как поле должно быть обязательным.

Есть ли способ убедиться, что метод myMB.handleUpload выполняется только после того, как было установлено свойство docType?

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

У меня была похожая проблема.

Изменить

<a4j:support event="onupload">

на

<a4j:support event="onclick">

Заданное действие типа документа будет выполнено перед загрузкой файла.Именно тогда, когда открывается файловая система проводника

0 голосов
/ 31 июля 2013

Я бы добавил возможность Ajax к выбранному компоненту. Таким образом, значение компонента немедленно обновляется каждый раз, когда пользователь изменяет значение выбора. Внутри вашего метода выгрузки файлов вы можете рассчитывать на значение bean-компонента, чтобы представить самый последний выбор, сделанный пользователем.

Вам нужно будет позаботиться только о том случае, когда пользователь начинает загрузку файла, не касаясь выбора. Либо у вас должно быть разумное значение по умолчанию, либо вы должны позаботиться о невозможности выбора и сделать поле выбора каким-либо образом обязательным перед загрузкой файла.

0 голосов
/ 11 ноября 2010
<f:setPropertyActionListener value="#{myMB.docType}" target="#{myMB.docType}" />

Я не понимаю тебя.Цель совпадает со значением.Вы в основном устанавливаете ценность цели с собой.Не является ли само значение просто уже null?

Во всяком случае, я не делаю RichFaces, поэтому я не могу вдаваться в подробности, но я знаю, что он использует Flash под обложками для компонента загрузки и что такая конструкция обычно запускает отдельную (и автономную)) запрос, который не учитывает все остальные параметры формы HTML.После этого «нормальные» входные данные JSF поступают в виде отдельного HTTP-запроса.Таким образом, вы как бы потерялись здесь без каких-либо неприятных хаков JS / ajax.По крайней мере, теоретически.

Лучше всего, чтобы вы захватили загруженный файл как свойство bean-компонента в методе слушателя, а затем обработали это далее в методе действия обычного bean-компонента (тот, который прикреплен к некоторому * 1007).* компонент в той же форме).

...