2012-12-23 43 views
0

考慮到JSF和AJAX,我有一個問題。 我想在訪問者插入客戶ID後更新一些客戶的詳細信息。f:ajax監聽器不叫

首先,從XHMTL代碼摘錄:

<h:form> 
    <h:panelGrid columns="2"> 
     <h:panelGrid columns ="2" border="1" id="customer_grid"> 
      <h:outputLabel value="#{mbean_msg.reservation_lblCustomerNo}" for = "customer_id"/> 
      <h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}"> 
       <f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" 
        render="customer_grid" /> 
      </h:inputText> 

      <h:outputLabel value="#{mbean_msg.reservation_lblLastname}" for="lastname"/> 
      <h:inputText id="lastname" value="#{reservationHandler.customer.lastname}" required ="true" 
       requiredMessage="#{error_msg.errmsgLastname}" validator="#{reservationHandler.validateCustomer}"/> 

      <h:outputLabel value="#{mbean_msg.reservation_lblFirstname}" for="firstname"/> 
      <h:inputText id="firstname" value="#{reservationHandler.customer.firstname}" required ="true" 
       requiredMessage="#{error_msg.errmsgFirstname}" validator="#{reservationHandler.validateCustomer}"/> 

偵聽器方法是我的java文件(ReservationHandler.java)內這樣實現的:

public void autocompleteCustomerDetails(){ 
     System.out.println("Auto Complete"); // for testing 
} 

基本上我試圖調用使用Listener的方法autocompleteCustomerDetails。不幸的是,這種方法從未被調用無論如何,渲染似乎工作得很好,因爲其他inputTexts更新自己(明顯)。

有沒有人有一個想法,爲什麼沒有調用監聽器?

+0

你的'ReservationHandler' bean的範圍是什麼?也嘗試將其簽名更改爲'public void autocompleteCustomerDetails(AjaxBehaviorEvent ev){}' – Daniel

+0

我也在之前使用AjaxBehaviorEvent嘗試過它,它沒有任何區別。我的bean是會話範圍。 – user1924889

+0

它是否適合你,如果你添加'event =「keyup」'到你的' Daniel

回答

0

試試這個:

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}" 
       render="customer_grid" /> 

或改變方法: getAutoCompleteCustomerDetails

只是用於測試...

總之,you're不允許使用任何JSF的組件庫?像primefaces? 它得到這樣一種簡單的方式來完成工作......

總之,與primefaces我是這樣做的:

<p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" /> 

另一種猜測是,添加執行=「@這個」來阿賈克斯國旗...

對不起,這些都是瘋狂的猜測,但我真的很想幫忙。 PLease反饋!

6

有在迄今所示的代碼的兩個問題:

首先,

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" /> 

這不是有效的EL表達式。 EL期待的形式爲#{},而不是{}。相應地對其進行修復:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" /> 

其次,

public void autocompleteCustomerDetails() { 

這不是<f:ajax listener>的方法表達的有效默認的簽名。 tag documentation明確告訴以下內容:

簽名必須匹配public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException

所以,你忘了論據。相應地添加它。 throws聲明對於未經檢查的異常不是強制性的,所以我們可以忽略它。

public void autocompleteCustomerDetails(AjaxBehaviorEvent event) { 

或者,如果你真的想要擺脫的說法,那麼你應該把括號中的EL方法表達:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails()}" /> 

注意,如果你的容器支持EL 2.2,這僅適用。

+0

感謝您的幫助。我按照您的建議調整了源代碼,但仍收到「找不到方法」異常。你知道這可能是爲什麼嗎? – user1924889

+0

您重建/重新部署/重新啓動了嗎? – BalusC

+0

是的,我也試圖把該方法放在另一個處理程序中 – user1924889