ValueChangeEvents запускается только после нажатия других компонентов

Я пытаюсь использовать InputFile в JSF (1.1.7) и Apache Trinidad (1.0.11). Я определяю для него событие изменения, но событие не запускается, когда я изменяю выбор файла, а когда я нажимаю на другой компонент формы.

Вот JSP-код:

    <trh:body>
        <tr:panelPage>
            <tr:form usesUpload="true" id="myForm"> 
                <tr:inputFile columns="80" id="archivo" 
                    valueChangeListener="#{myBean.changeInputFile}" 
                    immediate="true">
                </tr:inputFile>
                <tr:commandButton text="Begin"/>
            </tr:form>
        </tr:panelPage>
    </trh:body>

Вот соответствующая часть бина:

public void changeInputFile(ValueChangeEvent event) {
    UploadedFile f = (UploadedFile)event.getNewValue();
}

Код входит в метод myBean.changeInputFile только тогда, когда я нажимаю кнопку «Начать» (ранее изменив выбор файла). Я хотел бы, чтобы он входил в myBean.changeInputFile, когда я изменяю выбранный файл в компоненте inputFile.

Любая идея, почему это может происходить?


person Paco Abato    schedule 05.03.2019    source источник
comment
Если «другой компонент» действительно является кнопкой, то такое поведение полностью соответствует ожиданиям. Valuechangelisteners != ajax. Вам нужно проверить, работает ли ajax4jsf, но лучше было бы перейти на настоящий jsf2.3.   -  person Kukeltje    schedule 05.03.2019
comment
«Другой компонент» - это еще одна кнопка (кнопка «Начать» в опубликованном мной примере jsp), а не кнопка для выбора файла (компонент inputFile). И мигрировать не вариант :´(   -  person Paco Abato    schedule 05.03.2019
comment
Извините, я говорил не о кнопке выбора файла, а о кнопке «Начать». Так что все ведет себя так, как ожидалось   -  person Kukeltje    schedule 05.03.2019
comment
Что ж, ведет себя не так, как я ожидал :D Извините, я не понимаю логики такого поведения. Если я изменю выбранный файл, почему в этот момент не запускается событие ValueChangedEvent?   -  person Paco Abato    schedule 05.03.2019


Ответы (1)


Ваше ожидание неверно. valuechangelistener — это действие на стороне сервера, которое срабатывает, когда что-то отправляется на сервер и фактически имеет другое значение, чем раньше. Это НЕ говорит компоненту вести себя как современный ajax (jsf 1.1.7 и его valuechangelistener предшествуют эре ajax). Значение формы отправляется на сервер только тогда, когда вы, ну, в «старых» терминах html, используете отправку формы, например, нажимаете кнопку отправки (или используете какой-либо javascript для запуска этого, как в старые простые дни html). А так как без нажатия кнопки или добавленного javascript ничего не отправляется на сервер, то valuechangelistener не будет самопроизвольно что-то делать.

Таким образом, поведение, которое вы видите, именно такое, каким оно должно быть.

person Kukeltje    schedule 05.03.2019
comment
Спасибо за объяснение. Есть ли способ контролировать, когда пользователь изменяет выбранный файл? InputFile не допускает частичной отправки, а добавление onChange=submit() очищает текстовое поле, которое должно показывать путь к файлу. - person Paco Abato; 06.03.2019