3

MyFaces 1.1 を使用しています。<h:selectOneMenu>それぞれが同じvalueChangeListenerメソッドを指す2 つの s ドロップダウンがあります。

<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このメソッドでは、引数を介して現在のコンポーネントの ID を取得し、ValueChangeEvent次のように比較しています。

if (sourceId.equals("d1")) {
    // ...
} else if (sourceId.equals("d2")) {
    // ...
}

ただし、私の具体的な問題は、が変更さd2れたときにブロックも呼び出されることです。d1

私は1つと他のものを試してみましたが、次のことが問題の解決に役立つと考えました:

if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
      event.setPhaseId(PhaseId.INVOKE_APPLICATION);
      event.queue();
}

しかし、それが最善の解決策であるとは思えません。これはどのように発生し、上記のコードを使用せずにどのように解決できますか?

4

1 に答える 1