Jsf f:ajax侦听器未执行,因为呈现=";假;?

Jsf f:ajax侦听器未执行,因为呈现=";假;?,jsf,Jsf,我有一个commandLink,它有一个基于@RequestScoped bean中的值计算的“呈现的”。commandLink使用f:ajax调用监听器,但该方法似乎从未执行过 结果表明,如果我设置了rendered=“#{true}”或根本没有任何rendered属性,那么监听器将正确执行。是否可能因为呈现的是基于请求范围的值,而这些值在ajax回发时不再存在(因此导致“false”),所以侦听器被跳过?请注意,f:ajax还执行一些成功执行的执行操作。您不应该使用请求范围的bean来定义任

我有一个commandLink,它有一个基于@RequestScoped bean中的值计算的“呈现的”。commandLink使用f:ajax调用监听器,但该方法似乎从未执行过


结果表明,如果我设置了rendered=“#{true}”或根本没有任何rendered属性,那么监听器将正确执行。是否可能因为呈现的是基于请求范围的值,而这些值在ajax回发时不再存在(因此导致“false”),所以侦听器被跳过?请注意,f:ajax还执行一些成功执行的执行操作。

您不应该使用请求范围的bean来定义任何UI组件的呈现属性的值。除非您特别小心,否则原始bean将被销毁并丢失其值,每个请求将创建一个新的bean。因此,组件将被隐藏,因为对于下一个请求,呈现的属性值很可能没有计算为true


您应该为bean使用视图范围。请看一个示例,但您应该很容易找到其他示例来搜索类似于
'jsf呈现的属性请求范围bean'

的内容,即在执行回发时,不会重新呈现任何内容,因此可以假定“呈现的”属性在该点上没有任何影响。但很明显,它对侦听器执行有效,但对值提交无效。这对我来说似乎很奇怪。这种行为真的很奇怪和不直观,我有过非常糟糕的经历,我自己也不完全理解。我觉得这太糟糕了,我甚至看不到这个“功能”有任何合法的用途。我认为使用带有呈现的请求作用域应该立即为整个页面抛出一个“编译”错误,类似于EL表达式中的语法错误。作为一个解决方案,我使用了“从不使用请求范围”的咒语,它有效地让我避免了麻烦。也许@BalusC应该解释原因或者在这里添加一个更好的链接。相关:(第5点)