3

我正在使用 MyFaces 1.1。我有两个<h:selectOneMenu>下拉菜单,每个下拉菜单都指向相同的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>

当我更改第一个下拉列表时,值更改侦听器方法会正确触发。在该方法中,我sourceId通过ValueChangeEvent参数获取当前组件的 ID,然后进行如下比较:

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();
}

但是,我不认为这是最好的解决方案。这是如何引起的,如果不使用上述代码,我该如何解决?

4

1 回答 1

3

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

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

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

也可以看看:

于 2013-07-13T14:18:39.020 回答