仅在单击其他组件后才会触发 ValueChangeEvents

ValueChangeEvents being fired only after other components are clicked

我正在尝试在 JSF (1.1.7) 和 Apache Trinidad (1.0.11) 中使用 InputFile。我为它定义了一个更改事件,但是当我更改文件选择时没有触发该事件,但是当我单击表单的另一个组件时。

这里是 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>

这里是bean的相关部分:

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

当我单击“开始”按钮(之前更改了文件选择)时,代码仅进入 myBean.changeInputFile 方法。当我在 inputFile 组件中更改所选文件时,我希望它进入 myBean.changeInputFile。

知道为什么会这样吗?

您的解释有误。 valuechangelistener 是一个服务器端动作,当某些东西被提交到服务器并且有效地具有与以前不同的值时,它将被触发。它是 NOT 告诉组件表现得像现代 ajax(jsf 1.1.7 及其 valuechangelistener 早于 ajax 时代)。表单值仅在您 'old' html 术语中使用表单提交时提交给服务器,例如按下提交按钮(或使用一些 javascript 来触发,就像您在旧的平原 html 天)。由于没有按下按钮或添加 javascript,没有任何内容被提交到服务器,valuechangelistener 将不会自发地做一些事情。

所以您看到的行为与它应该的完全一样。