簡體   English   中英

當f:ajax被執行時,總是調用JSF2 preRenderComponent

[英]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可以是ViewComponent )本質上是一種“變通方法”,用於在視圖參數被調用之后能夠調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM