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

标签 jsf jsf-2 selectonemenu valuechangelistener

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

这是我在这里的第一篇文章。这是我的 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";
} 

最佳答案

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

您尚未声明 value属性,所以它的默认值实际上是 null .如果列表的默认选中项不是 null ,然后是 valueChangeListener将被调用。

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

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

您需要使用与下拉列表的默认值相同的值来预填充它。
this.needsLevel = "not_assessed";

或者,您也可以设置默认值 null .
<f:selectItem itemValue="${null}" itemLabel="----Not assessed----"/>

与问题无关,因为您已经使用 JSF 2.0,我建议使用 <f:ajax>仅通过ajaxical powers 提交最近更改的下拉列表,而不是使用onchange="submit()"提交整个表格。毕竟这对用户体验更好。
<h:selectOneMenu>
    <f:ajax />
</h:selectOneMenu>

另外,valueChangeListener方法不需要返回任何东西。无论如何它都会被忽略。只需申报void .

关于JSF selectOneMenu 正在刷新并返回到以前的状态,而不是显示新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4746625/

相关文章:

jsf - FacesContext 实例在 ApplicationScoped Managedbean 中为 null

java - Primefaces - 不显示必填字段的消息,仅突出显示边框

ajax - 通过ajax渲染其他表单会导致其 View 状态丢失,如何将其添加回来?

java - 如何使用 AJAX 使两个 JSF selectOneMenu 相互依赖?

jsf - <p :selectOneMenu> generates input field behind select box

JSF SelectItem和转义(xss)

javascript - 无法在 JSF 中用 JavaScript 替换 div 内容

java - 无法使用 JSF 访问托管 bean 方法

jsf - 如何在 f :selectItem(s) 中使用枚举值

java - 如何从 Web 应用程序的根目录引用 Java Web 应用程序中的任何图像?