JSF selectOneMenu 正在刷新并返回到之前的状态,而不是显示新值

Posted

技术标签:

【中文标题】JSF selectOneMenu 正在刷新并返回到之前的状态,而不是显示新值【英文标题】:JSF selectOneMenu is refreshing and going back to its previous state rather than showing the new value 【发布时间】:2011-06-12 09:49:55 【问题描述】:

我有一个数据表,其中有很多 selectOneMenu 项目可用,例如,10 个项目每个都有一个 selectOneMenu 组合。现在,如果我单击任何组合,他们应该将值保存在数据库中并且他们会这样做。但在保存更改后的值后,selectOneMenu 将返回到之前的状态。我希望 selectOneMenu 保持其当前状态。此外,正在为数据表中的每个组合调用该方法。我真的很想知道为什么!在过去的两周里,我一直在敲我的头。任何帮助将非常感激。提前致谢。

这是我在这里的第一篇文章。这是我的 jsf 数据表:

<h:dataTable value="#careNeedBean.controlledCareNeedsList" var="careNeed"
        id="careneed_table" binding="#careNeedBean.dataTable">
<h:column>
 <f:facet name="header">
  <h:outputText value="NeedsLevel"/>
 </f:facet>
 <h:selectOneMenu id="needs_level_combo" style="width:200px;font-size:9px;"
                                         onchange="submit()" 
                                         valueChangeListener="#careNeedBean.saveTaskAsessment"
                                         binding="#careNeedBean.selectOneMenu">                                      
  <f:selectItem itemValue="not_assessed" itemLabel="----Not assessed----"/>
                    <f:selectItems value="#careNeed.humanReadableNeedsList" />
 </h:selectOneMenu>
</h:column>

这是我的 bean 代码:

public String saveTaskAsessment(ValueChangeEvent event) 
   //does some things
   return "Success";
 

【问题讨论】:

【参考方案1】:

valueChangeListener 不会仅在最近更改的组件上运行。事实上,您正在使用 javascript submit() 函数来提交 整个 表单。只要新选择的值与value 属性中声明的旧值不同,valueChangeListener 就会始终执行。

您没有声明value 属性,因此它的默认值实际上是null。如果列表的默认选中项是notnull,则将调用valueChangeListener

要解决这个问题,您需要为组件分配一个value 属性

<h:selectOneMenu value="#careNeed.needsLevel">

并且您需要使用与下拉列表的默认值相同的值预填充它。

this.needsLevel = "not_assessed";

或者,您也可以将默认值设为null

<f:selectItem itemValue="$null" itemLabel="----Not assessed----"/>

与问题无关,因为您已经在 J​​SF 2.0 上,我建议使用 &lt;f:ajax&gt; 仅提交最近更改的下拉列表,而不是使用 onchange="submit()" 提交整个表单。毕竟这对用户体验来说更好。

<h:selectOneMenu>
    <f:ajax />
</h:selectOneMenu>

另外,valueChangeListener 方法不需要返回任何内容。无论如何都会被忽略。只需声明void

【讨论】:

【参考方案2】:

您可以使用 AjaxSingle="true" 和 onsubmit="form.refresh();"根据您的 ajax 请求。

这样它只会处理当前组件。 form.refresh();将删除旧的缓存值。 您将获得刷新后的 bean 值。

【讨论】:

以上是关于JSF selectOneMenu 正在刷新并返回到之前的状态,而不是显示新值的主要内容,如果未能解决你的问题,请参考以下文章

JSF 1.1-不刷新页面调用backing bean的动作方法(通过ajax/javascript)

当通过链接或后退按钮打开时,强制 JSF 刷新页面/视图/表单

带有ajax调用的jsf通过轮询获取动态值

从 JSF 操作返回 null 和 "" 之间的区别

在JSF中注销后尝试再次登录时出现ServletException

JSF:使用带有 ICEfaces 的 AJAX 推送 (ICEpush)