5

我有一个数据表,其中有很多 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";
} 
4

2 回答 2

3

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

你没有声明一个value属性,所以它的默认值是有效的null。如果列表的默认选定项不是 null,则将valueChangeListener调用 。

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

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

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

this.needsLevel = "not_assessed";

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

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

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

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

此外,该valueChangeListener方法不需要返回任何内容。无论如何都会被忽略。就申报吧void

于 2011-01-20T12:23:03.337 回答
1

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

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

于 2014-09-11T07:41:49.763 回答