【发布时间】: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 在这个问题的范围内?
标签: jsf selectonemenu valuechangelistener