<h:selectOneMenu> 为所有下拉列表调用值更改侦听器,而不仅仅是当前
Posted
技术标签:
【中文标题】<h:selectOneMenu> 为所有下拉列表调用值更改侦听器,而不仅仅是当前【英文标题】:<h:selectOneMenu> value change listener invoked for all dropdowns instead of only the current 【发布时间】:2013-07-11 21:51:24 【问题描述】:我正在使用 MyFaces 1.1。我有两个 <h:selectOneMenu>
s 下拉菜单,每个下拉菜单都指向相同的 valueChangeListener
方法。
<h:selectOneMenu id="d1" value="#mybean.selectedChannel1"
onchange="submit()" valueChangeListener="#myform.channelValuechange">
<f:selectItems value="#mybean.channelList"/>
</h:selectOneMenu>
<h:selectOneMenu id="d2" value="#mybean.selectedChannel2"
onchange="submit()" valueChangeListener="#myform.channelValuechange">
<f:selectItems value="#mybean.channelList"/>
</h:selectOneMenu>
当我更改第一个下拉菜单时,值更改侦听器方法会正确触发。在该方法中,我通过ValueChangeEvent
参数获取当前组件的ID为sourceId
,然后进行如下比较:
if (sourceId.equals("d1"))
// ...
else if (sourceId.equals("d2"))
// ...
但是,我的具体问题是 d2
块在 d1
更改时也会被调用。
我尝试了一个和另一个,并认为以下有助于解决问题:
if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION))
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
但是,我不认为这是最好的解决方案。这是怎么引起的,不使用上面的代码如何解决?
【问题讨论】:
两个selectOneMenu
组件具有相同的选定值属性。当一个被改变时,第二个也被改变,这就是动作监听器触发两次的原因。
您可以在faces-config.xml
文件中更改会话的勺子,或者切换到JSF2,在JSF2中您可以将其设置为注释:D
我正在处理旧应用程序,因此无法使用 JSF2。我需要坚持 JSF1.1
@user2511414 1.1 有什么不同。和 2.x 在这个问题的范围内?
【参考方案1】:
使用onchange="submit()"
,您基本上是在当前输入元素更改时提交整个表单,而不仅仅是当前更改的输入!与许多初学者的错误想法相反,这里没有任何特定于输入的 javascript/Ajax 魔法。当您提交整个表单时,它会触发所有输入组件的处理。
valueChangeListener
总是在输入组件的提交值不像支持 bean 中的 equals()
初始模型值时被调用。鉴于在您的情况下,当您仅更改第一个菜单时,两个菜单都会触发值更改侦听器,这只能意味着第二个菜单的默认选择项值不会 equals()
支持 bean 中的初始模型值。
您需要确保第二个菜单的#mybean.selectedChannel2
默认与第二个菜单列表的#mybean.channelList
的第一项具有完全相同相同的值。这样,当您更改第一个菜单时,不会为第二个菜单调用值更改侦听器。
另见:
When to use valueChangeListener or f:ajax listener?(只是为了了解 JSF 2 的不同之处,以供您感兴趣)【讨论】:
非常感谢巴鲁!!您的答案是 100% 明确的,可以解决问题。我会仔细检查我的代码 #mybean.selectedChannel2 是否更改,当第一次下拉更改时[:)我错过了这个!!] @Balu-你是对的。 #mybean.selectedChannel2 值在第一个下拉列表被选中时发生变化。我已经修复了这个错误,现在 ValueChangeListener 工作正常。谢谢。 @Javel - 我也面临同样的问题。你是怎么解决这个问题的。?有什么办法解决这个问题? @BalusC - 有没有最好的解决方案? @Jai:升级到 JSF 2.x 并改用 。以上是关于<h:selectOneMenu> 为所有下拉列表调用值更改侦听器,而不仅仅是当前的主要内容,如果未能解决你的问题,请参考以下文章
h:selectOneMenu 中的 f:ajax 监听方法没有执行
JSF2 <h:selectOneMenu 和 <f:ajax 侦听器在 PrettyFaces 过滤器导航之后未调用
刷新页面后,会话范围的 selectOneMenu 值更改回默认值 [重复]
如何让 h:inputText 的必需属性依赖于 h:selectOneMenu 中的某些值集?
Rendering table h:dataTable with f:ajax when select h:selectOneMenu confuses f:validateLength