gpt4 book ai didi

jsf - value change listener invoked for all dropdowns instead of only the current

转载 作者:行者123 更新时间:2023-12-02 00:07:08 26 4
gpt4 key购买 nike

我正在使用 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>

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

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

但是,我的具体问题是 d2d1 时也会调用 block 被改变了。

我尝试了一个和另一个并认为以下有助于解决问题:

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

但是,我不认为这是最好的解决方案。这是怎么引起的,不使用上面的代码怎么解决?

最佳答案

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

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

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

另见:

关于jsf - <h :selectOneMenu> value change listener invoked for all dropdowns instead of only the current,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com