[英]JSF2 preRenderComponent is called always when f:ajax is executed
我有一个由NewsBean.java支持的JSF页面,其中<f:event type="preRenderComponent" listener="#{newsBean.init}" />
作为bean初始化程序。
页面底部有一个按钮,用于发送注释: <f:ajax event="click" execute="@form" render="@form" listener="#{newsBean.sendComment}" />
和被<h:form>
包围。 单击按钮时,始终会调用NewsBean.init()
。
我的bean范围是视图。 这是一个有效的行为(总是调用init())? 如何防止始终调用init()
?
无论是初始请求还是回发请求,都会在预呈现事件上调用preRender
侦听器。 每个请求都有一个呈现响应阶段,无论它是普通请求还是ajax请求。 所以这种行为是通过规范。 如果是回发请求,则需要通过检查FacesContext#isPostback()
来检查自己的侦听器方法。
public void sendComment() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
<f:event type="preRenderXxx">
(其中Xxx
可以是View
或Component
)本质上是一种“变通方法”,用于在视图参数被调用之后能够调用bean动作方法的功能要求在初始请求中处理。 在即将推出的JSF 2.2中,将引入一个新的<f:viewAction>
标签,它应该完全符合<f:viewAction>
的工作:
<f:viewAction action="#{newsBean.sendComment}" />
此标记支持onPostback
属性,该属性已默认为false
:
<f:viewAction action="#{newsBean.sendComment}" onPostback="false" />
JSF 2.2将于2012年第一季度发布.JSF 2.2的快照版本目前已经发布。
我想你的<f:event>
标签放在<h:form>
标签内。 因此,当您单击ajax按钮时,它会重新呈现整个<h:form>
组件,从而导致再次触发preRenderComponent事件。
我认为你应该使用的是PreRenderViewEvent 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.