Primefaces 6:使用模式简单的 fileUpload 组件禁用按钮上传

Primefaces 6: disable button Upload with fileUpload component with mode simple

我正在使用 Primefaces 6 并创建了一个 fileUpload 组件,如下所示:

                <p:fileUpload id="myId" 
                          styleClass="MY-STYLE" 
                          value="#{bean.objUploadedFile}" 
                          mode="simple" 
                          skinSimple="true" 
                          multiple="false"
                          update="@form"
                          label="Choose"
            >
            </p:fileUpload>

我必须使用 mode=simple 所以 ajax 是错误的。然后我添加一个按钮来管理上传:

                <p:commandButton id="btnId" 
                             value="Upload" 
                             disabled="#{myBean.btnDisabled}"
                             process="@form"
                             update="@form"
                             ajax="false"
                             actionListener="#{myBean.manageUpload}" 
            />

此按钮加载 disable=true 启动。 当用户点击 fileUpload 组件中的 Choose 按钮​​时,我可以为此按钮设置 disable=false 吗?我尝试使用 javascript 但它不起作用。 可能吗?

不幸的是,这是不可能的,我尝试并发现 fileUpload 是 "non-ClientBehaviorHolder parent"(又名。不 p:ajax )。

第二个选项是使用生成的输入类型="file" ( https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file ) 的 java 脚本事件之一,但是素面不会暴露...

这意味着 jsf - prime faces 的方式,至少在简单模式下,是让按钮始终启用并验证表单提交时的文件选择。

虽然如果你真的 want/need 启用文件选择按钮,你可以使用 jquery 将事件侦听器附加到将启用按钮的输入类型="file",但是这个选项有点 hack,所以我不推荐它,因为当你乱搞它们预期的组件行为时,prime-faces 和 jsf 往往是无情的。