<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。我有两个 &lt;h:selectOneMenu&gt;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 值渲染 [重复]

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