Ikt*_*der 5 jsf selectonemenu valuechangelistener jsf-2
我有一个数据表,其中有很多 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>
Run Code Online (Sandbox Code Playgroud)
这是我的豆代码:
public String saveTaskAsessment(ValueChangeEvent event) {
//does some things
return "Success";
}
Run Code Online (Sandbox Code Playgroud)
它valueChangeListener
不仅仅在最近更改的组件上运行。事实上,您正在使用 JavaScriptsubmit()
函数来提交整个表单。valueChangeListener
每当新选择的值与属性中声明的旧值不同时,将始终执行value
。
您尚未声明value
属性,因此其默认值为 effective null
。如果列表的默认选定项不是, null
则将valueChangeListener
调用 。
要解决此问题,您需要value
为组件分配一个属性
<h:selectOneMenu value="#{careNeed.needsLevel}">
Run Code Online (Sandbox Code Playgroud)
并且您需要预先填充与下拉列表的默认值相同的值。
this.needsLevel = "not_assessed";
Run Code Online (Sandbox Code Playgroud)
或者,您也可以设置默认值null
。
<f:selectItem itemValue="${null}" itemLabel="----Not assessed----"/>
Run Code Online (Sandbox Code Playgroud)
与问题无关,因为您已经使用了 JSF 2.0,所以我建议使用<f:ajax>
ajaxical 权限仅提交最近更改的下拉列表,而不是使用onchange="submit()"
提交整个表单。毕竟这对用户体验来说更好。
<h:selectOneMenu>
<f:ajax />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
此外,该valueChangeListener
方法不需要返回任何内容。无论如何都会被忽略。就声明一下吧void
。