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