ValueChangeEvents запускается только после нажатия других компонентов - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь использовать 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.

Есть идеи, почему это может происходить?

1 Ответ

3 голосов
/ 05 марта 2019

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

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

...