我有2个tr:selectOneChoice组件,每个组件都有自己的valueChangeListener方法。问题是当从下拉框1更改值时,它将调用操作方法1,这是预期的。
但是当从下拉框2中更改值时,它将按顺序调用操作方法1和操作方法2,这非常奇怪,它根本不应该调用操作方法1。最糟糕的是,即使我点击同一页面上的不同按钮,它们也会按顺序调用两种动作方法,这非常糟糕,我不知道如何解释它。
我正在使用MyFaces,Facelets,Trinidad。非常感谢你。
答案 0 :(得分:0)
仅当提交的值与验证阶段关联的getter返回的值不同时,才会调用valueChangeListener
。导致特定问题的最常见原因之一是bean是请求范围的,并且未保留初始值。
如果您使用的是JSF 2.0,则需要将bean放在view
范围内,以便在相同视图的直接后续请求中保留它。但是当你仍然使用1.x时,最简单的解决方法是将bean放在会话范围内。但是,这也有一些警告;当用户在同一浏览器会话中的不同选项卡/窗口中打开同一页面时,它们将相互干扰。然后,最佳解决方案是使用Tomahawk的<t:saveState>
。将以下行放在页面中的某个位置,其中包含下拉列表:
<t:saveState value="#{bean}" />
这样,bean将保留在同一视图的后续请求中,其作用类似于新的JSF 2.0 view
范围。