f:ajax 监听器不能与 h:selectOneRadio 一起使用

Posted

技术标签:

【中文标题】f:ajax 监听器不能与 h:selectOneRadio 一起使用【英文标题】:f:ajax listener not working with h:selectOneRadio 【发布时间】:2017-02-12 19:33:49 【问题描述】:

为清晰起见,添加了附加信息

我们正在将应用程序从 JBoss 5 迁移到 Tomee 7.0.1+。在 Tomee 上,我们使用 MyFaces 2.2.10 和 RichFaces 4.2.0(在 Jboss 上,我们使用 Mojarra JSF 而不是 MyFaces)。

我们遇到了 f:ajax 侦听器未触发单选按钮列表中的值更改的问题。这是我们的代码:

 <h:selectOneRadio value="#managedBean.paramsType"
   layout="pageDirection">
   <f:selectItem itemValue="Item1" itemLabel="Item1" />
   <f:selectItem itemValue="Item2" itemLabel="Item2" />
   <f:ajax render="@form" execute="@form" listener="#managedBean.checkSelection" />
  </h:selectOneRadio>

<h:selectManyCheckbox value="#managedBean.objectList" layout="pageDirection">
   <f:selectItem itemValue="checkOption1" itemLabel="Option1" itemDisabled="#managedBean.paramsType == 'Item3'"/>
   <f:selectItem itemValue="checkOption2" itemLabel="Option2" itemDisabled="#managedBean.paramsType == 'Item1'"/>
   <f:selectItem itemValue="checkOption3" itemLabel="Option3" itemDisabled="#managedBean.paramsType == 'Item2'"/>
</h:selectManyCheckbox>

在托管 bean 中,checkSelection 方法具有以下签名:

public void checkSelection()

 //update objectList (select or deselect items) based on radio button selection

在 TomEE 上运行应用程序时从不调用检查选择,但在 JBoss 上也一样(相同的代码)。

在 TomEE 上,我们尝试添加 AjaxBehaviorEvent 作为 checkSelection 方法的输入参数,但无论有没有这个参数,该方法都不会被调用。看起来 f:ajax 的侦听器属性由于某种原因没有处理事件。

浏览器控制台或应用程序或服务器日志中不会报告任何错误 - 该方法根本不会被调用。此外,h:messages 不会显示任何错误。

此外,我们尝试使用 a4j:ajax 和 valueChangeListener。 a4j:ajax 的行为与 f:ajax 相同 - 不调用托管 bean 中定义的方法; valueChangeListener 对我们不起作用,因为它是由与 f:ajax 侦听器不同的事件触发的,我们需要更改单选按钮中的选择以影响对同一表单上 h:selectManyCheckbox 组件的选择。

【问题讨论】:

什么是“不工作”?您是否看到正在发送的网络 ajax 调用未到达您的方法?根本没有发送ajax调用吗?您是否尝试将显式 event 添加到 ajax 标记?您的页面中有 h:messages 吗?浏览器控制台中的任何错误?当它在 JBoss 上工作时,它是 100% 相同的吗?顺便说一句,完整的minimal reproducible example 是最少的,这意味着其他人最容易使用复制 感谢您的热心意见。我已经用更多信息编辑了原始问题。希望现在已经足够清楚了。 这对调试问题有帮助吗? ***.com/q/2118656 嗨 BalusC。感谢您的及时回复。我检查了您附加的链接,并通过了所有项目和调试。什么都没发生。整个程序在
标签中。此外,当我将 h:selectOneRadio 更改为 h:selectOneMenu 或 h:selectOneListbox 时,会调用方法并且一切正常。此外,尝试使用 h:selectBooleanCheckbox 并且它也可以工作。只有单选按钮是问题所在。你知道这是否存在一些已知问题吗?提前致谢
【参考方案1】:

对于新人:我遇到了几乎相同的问题,几乎用尽了互联网,没有解决方案。

从 jsf 2.2(.?) 迁移到 2.3 时解决。

顺便说一句,@#$%!@#$*,以另一种方式损失了 2 天,所以将此作为学习/记住的艰难方法,当遇到此类问题时,请始终先升级您的库...

附录:不要盲目更新您的库。

正如 Jon Bates 所指出的,每一次更改都可能会在系统中引入新的 bug,虽然新旧主题本身存在争议,但普遍的共识是,在处理已经存在的问题时,好的做法是事实证明,稳定的系统,是将更改保持在最低限度,直至归档新的预期目标。这就是为什么好的库通常有主要、次要和修订号的原因之一,看看它们。

【讨论】:

欢迎您!回答时,请确保您的回答切中要害,并记住盲目升级库并不总是一个好主意。.. 嗨乔恩!通过您的回答,我认为您在这方面有一定的经验,感谢您分享您的观点。但是“当面对这样的问题时”是这里的重点,有时这不是选择的问题,所以不要认为这是盲目的选择。在我们的领域里,害怕是经过一段时间的练习后才出现的,我相信这是一件好事,但不要把它推到你害怕做你需要做的事情的地步。顺便说一句,比“从 xx 迁移到 yy 时解决”更重要?问候。 当然!我今天通过升级库解决了我的盒子上的一个问题。我还升级了另一个库(只是 SemVer 语义中的版本升级)不得不处理完全奇怪的意外愚蠢问题。恐怕我仍然不得不不同意这个建议,但我不会反对这个答案。当您在此站点上获得如此多的积分时,您可以调整答案。在看到您的答案之前,我允许故意低质量的test 答案滑过,被告知并认为您的答案是另一个测试。但是,除非您进行编辑(网站不允许),否则我无法更改我的分数 嗨,乔恩,对于我回答问题和你的方式,我深表歉意:经过两天的错误尝试,我的状态并不好。我想我明白了你看到的错误:句子的第二部分“总是……”太强了,所以我写了一个附录。至于取消投票,我很欣赏你的意图,别担心,作为讨论列表的老用户,我现在可以在没有某种控制的情况下谈论一切,所以我接受一个 o其他反对票是维持健康生态系统的小小代价。 出现问题时您使用了哪些显式版本和 impl?

以上是关于f:ajax 监听器不能与 h:selectOneRadio 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

JSF f:ajax 监听器 vs commandButton 动作

h:commandLink 动作和 f:ajax 监听器的调用顺序

JSF 2——在 f:ajax 上具有可选监听器属性的复合组件

h:selectOneMenu 中的 f:ajax 监听方法没有执行

在调用 f:ajax 侦听器之前和之后执行 JavaScript

JSF2 <h:selectOneMenu 和 <f:ajax 侦听器在 PrettyFaces 过滤器导航之后未调用