【问题标题】:How to refresh page in JSF on selectOneMenu selection?如何在 JSF 中刷新 selectOneMenu 选择的页面?
【发布时间】:2012-06-20 19:31:54
【问题描述】:

我有一个页面,其中包含一个 PrimeFaces (2.2.1) 编辑器组件、一个刷新按钮和一个 selectOneMenu,其选择会影响编辑器的内容,如下所示:

<p:editor id="uploadedText" value="#{facilityDataUploadBean.uploadedText}"
          width="600" height="180" disabled="true" controls="" />
<h:commandButton value="Refresh" immediate="true" />
<h:selectOneMenu id="skipLines" styleClass="dropdown"
                 value="#{facilityDataUploadBean.skipLines}">
    <f:selectItems value="#{facilityDataUploadBean.skipLinesList}" />
    <f:ajax listener="#{facilityDataUploadBean.importParameterChanged}" />
</h:selectOneMenu>

facilityDataUploadBean.importParameterChanged 更新 facilityDataUploadBean.uploadedText。更改 selectOneMenu 值后,操作员按下 Refresh 按钮刷新页面,包括 p:editor 的内容。 (我不能简单地使用 AJAX 刷新 p:editor,因为它不能正确重新渲染,至少在 PF 2.2.1 中是这样。)

似乎我应该能够在selectOneMenu 值更改时自动完成页面刷新,但我一直无法想出可以做到这一点的属性和事件的组合。我在selectOneMenu 上尝试了onchange="submit();"immediate="true"valueChangeListener 的各种组合,以及f:ajax 事件上的execute="@all/@form"render="@all/@form" 的各种组合,但都无济于事。我目前的解决方法是显示一条消息,要求用户在更改selectOneMenu 选择时按下刷新按钮 - 非常狡猾。

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    onchange 事件中调用window.location.replace(window.location.href) 而不是submit(),如下所示:

    <h:selectOneMenu id="skipLines" ... onchange="window.location.replace(window.location.href);">
        <f:selectItems ... />
        <f:ajax ... />
    </h:selectOneMenu>
    

    【讨论】:

    • 偶尔,对 selectOneMenu 的更改不会“采取” - 可能页面刷新发生在设置支持 bean 中的值的 AJAX 执行之前。但我没有看到它使 UI 处于不一致状态或显示与支持 bean(SessionScoped)当前持有的值不同的值。
    • 请注意,此解决方案还避免了证书选择(可能需要或不需要)。
    【解决方案2】:

    请尝试onchange="window.location.reload();" 方法,例如:

    <h:selectOneMenu id="skipLines" ... onchange="window.location.reload();">
        <f:selectItems ... />
        <f:ajax ... />
    </h:selectOneMenu>
    

    这在我的环境(GF 3.1.1,PF 3.2)中运行良好,但请注意可能会中断某些 ajax 功能。

    希望这会有所帮助,玩得开心!

    【讨论】:

    • 当我这样做时,我得到了 this question 抱怨的相同对话框。然而,解决方案是使用window.location.replace(window.location.href) 而不是window.location.reload()this question 的答案告诉我。
    • 很高兴听到您找到了适合您的解决方案!干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2014-06-21
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多