我正在使用 MyFaces 1.1。我有两个<h:selectOneMenu>
每个都指向相同的下拉菜单valueChangeListener
method.
<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>
当我更改第一个下拉列表时,值更改侦听器方法会正确触发。在该方法中,我获取当前组件的 ID,如下所示sourceId
via ValueChangeEvent
论证,然后比较如下:
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();
}
但是,我不认为这是最好的解决方案。这是如何引起的以及如何在不使用上述代码的情况下解决它?
With onchange="submit()"
你基本上是在提交entire当当前输入元素改变时,表单不仅仅是当前改变的输入!与许多初学者的错误想法相反,这里没有任何特定于输入的 JavaScript/Ajax 魔法。当您提交整个表单时,它将触发以下处理all输入组件。
The valueChangeListener
is always当输入组件的提交值不存在时调用equals()
支持 bean 中的初始模型值。鉴于在您的情况下,当您仅更改第一个菜单时,两个菜单都会命中值更改侦听器,这只能意味着第二个菜单的默认选择项值不会equals()
支持 bean 中的初始模型值。
你需要确保#{mybean.selectedChannel2}
第二个菜单的默认有exactly与第一项的值相同#{mybean.channelList}
第二个菜单的列表。这样,当您更改第一个菜单时,不会为第二个菜单调用值更改侦听器。
也可以看看:
-
何时使用 valueChangeListener 或 f:ajax 监听器? https://stackoverflow.com/questions/11879138/when-to-use-valuechangelistener-or-fajax-listener/11883021#11883021(只是为了了解 JSF 2 中的不同之处,对于您感兴趣的情况)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)