Firefox 页面刷新后 Primefaces selectOneMenu 更改值

Primefaces selectOneMenu changes value after page refresh in firefox

我正在使用带有更改事件调用的 PrimeFaces SelectOneMenu。 当我更改它的值时,更改方法会调用并设置一些参数。当我刷新页面时,在 bean 端,选择的值更改为默认值,但在 UI 中,显示更改的值。因此,当用户单击提交时,setter 方法会更改值但不会调用更改方法。 这是 UI 代码:

<p:selectOneMenu value="#{bean.selectedType}">
    <f:selectItems value="#{bean.types}"/>
    <p:ajax event="change" listener="#{bean.changeType}" update=":form"/>
</p:selectOneMenu>
<p:commandButton actionListener="#{bean.changeType}" update=":form"/>

检查您的 bean 是否为 @RequestScoped。如果是这样,将其更改为 @ViewScoped.

您是否尝试将 process="@this" 放入 ajax 组件中?

我用remoteCommand组件解决了这个问题,在页面刷新后更新selectOneMenu。不要忘记在 @PostConstruct 方法中将所选变量设置为 null。

该问题仅在 Firefox 浏览器上出现。

代码:

<p:remoteCommand name="rcName"
                 update="@form"
                 autoRun="true"
                 ignoreAutoUpdate="true" />code

我最近遇到了同样的问题,并且能够通过向 HTTP-Header.

添加显式 no-cache 指令来解决它

例如实施 javax.servlet.Filter class 并执行类似

的操作
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;

    httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, 
    must-revalidate"); // HTTP 1.1.
    httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    httpServletResponse.setDateHeader("Expires", 0); // Proxies.

在 doFilter() 方法中。

然后只需将 filter-class 应用到您要在 web.xml

中过滤的页面

对我来说,这是通过 https://www.logicbig.com/tutorials/misc/primefaces/select-one-menu-with-ajax.html

中的示例解决的

关键是 ajax change 事件没有得到很好的支持(它似乎没有触发 update)。使用 itemSelect 而不是完全解决了这个问题。

<p:ajax event="itemSelect" update="@all"/>