【问题标题】:<h:selectOneMenu> value change listener invoked for all dropdowns instead of only the current<h:selectOneMenu> 为所有下拉列表调用值更改侦听器,而不仅仅是当前
【发布时间】: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 在这个问题的范围内?

标签: jsf selectonemenu valuechangelistener


【解决方案1】:

使用onchange="submit()",您基本上是在当前输入元素更改时提交整个表单,而不仅仅是当前更改的输入!与许多初学者的错误想法相反,这里没有任何特定于输入的 JavaScript/Ajax 魔法。当您提交整个表单时,它会触发所有输入组件的处理。

valueChangeListener总是在输入组件的提交值不像支持 bean 中的 equals() 初始模型值时被调用。鉴于在您的情况下,当您仅更改第一个菜单时,两个菜单都会触发值更改侦听器,这只能意味着第二个菜单的默认选择项值不会 equals() 支持 bean 中的初始模型值。

您需要确保第二个菜单的#{mybean.selectedChannel2} 默认与第二个菜单列表的#{mybean.channelList} 的第一项具有完全相同相同的值。这样,当您更改第一个菜单时,不会为第二个菜单调用值更改侦听器。

另见:

【讨论】:

  • 非常感谢巴鲁!!您的答案是 100% 明确的,可以解决问题。我会仔细检查我的代码 #{mybean.selectedChannel2} 是否更改,当第一次下拉更改时[:)我错过了这个!!]
  • @Balu-你是对的。 #{mybean.selectedChannel2} 值在第一个下拉列表被选中时发生变化。我已经修复了这个错误,现在 ValueChangeListener 工作正常。谢谢。
  • @Javel - 我也面临同样的问题。你是怎么解决这个问题的。?有什么办法解决这个问题?
  • @BalusC - 有没有最好的解决方案?
  • @Jai:升级到 JSF 2.x 并改用
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多