2012-11-23 79 views
0

我有一個帶有監聽器的p:ajax的多輸入字段。他們都連接到同一個監聽器。我怎麼知道哪個組件觸發了監聽器?如何知道哪個組件觸發了一個p:ajax請求

<h:inputText id="postalCode" size="20" value="# businessPartner.primaryAddress.postalCode}" 
<p:ajax event="change" listener="#{businessPartner.primaryAddress.retrievePostalCodeCity}" > 
</p:ajax> 
</h:inputText> 

<h:inputText id="city" size="60" value="# businessPartner.primaryAddress.city}" 
<p:ajax event="change" listener="#{businessPartner.primaryAddress.retrievePostalCodeCity}" > 
</p:ajax> 
</h:inputText> 



public void retrievePostalCodeCity() throws MWSException { 
    int country = address.getCountryId(); 
    String postalCode = address.getPostalCode(); 
    String city = address.getCity(); 
} 

我有這個問題,因爲我用A4J AJAX,但我移動的項目,充分primefaces,不再RichFaces的。 a4j的監聽器有一個AjaxBehaviorEvent事件,在那裏我可以做event.getComponent()。getId()

我該怎麼做同樣的素質ajax?

回答

2

AjaxBehaviorEvent不是特定於RichFaces。它特定於JSF2本身。所以你可以繼續在PrimeFaces中使用它。

public void retrievePostalCodeCity(AjaxBehaviorEvent event) { 
    UIComponent component = event.getComponent(); 
    // ... 
} 

作爲替代,或者它的真的不可能在其他地方的情況下,你總是可以使用新的JSF2 UIComponent#getCurrentComponent()方法。

public void retrievePostalCodeCity() { 
    UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()); 
    // ... 
} 

順便說一句,同樣的結構應該只是用JSF2自己<f:ajax>罰款。我看不到有任何理由在這裏使用<p:ajax>。但是,如果您實際使用的是PrimeFaces組件,例如<p:inputText>,它將是唯一的方法。


無關到具體問題,event="change"已經是默認的。你可以忽略它。

+1

我通常更喜歡p:ajax,因爲如果我需要知道已完成的過程,那麼它就是不完整的。 – HRgiger

+1

的確如此,但是OP的特定結構並未顯示出來。我明確提到,在OP的特定結構中,''可以用作良好的。 – BalusC

+0

我不想使用onstart和oncomplete,因此我使用p:ajax。問題是如果我將偵聽器更改爲public void retrievePostalCodeCity(AjaxBehaviorEvent event){。我得到一個錯誤:javax.faces.FacesException:Target Unreachable,標識符'businessPartner'解析爲null – roel

0

這幾乎是相同的primefaces:

<p:ajax event="change" listener="#{businessPartner.primaryAddress.retrievePostalCodeCity}" /> 


import javax.faces.event.AjaxBehaviorEvent; 
..... 
public void retrievePostalCodeCity(AjaxBehaviorEvent event) { 
... 
} 

如果您想通過按鈕組件動作/ ActionListener的標籤,你可以使用ActionEvent和任何情況下訪問確保你設置AJAX =」真正的「

<p:commandLink actionListener="#{businessPartner.primaryAddress.retrievePostalCodeCity}" ajax="true" /> 

import javax.faces.event.ActionEvent; 

.... 

public void retrievePostalCodeCity(ActionEvent event) { 
    ... 
    } 
+0

這個答案是已經給出。你爲什麼重複已經給出的答案?這是一個問答網站,而不是一個普通和原始的討論論壇,其中每個人在協議後重復彼此。如果你有一個協議,只需通過投票表達,而不是重複答案。 – BalusC

+1

我在寫作時已經完成了,但是我已經更新了其他信息。你可以保留更多的信息,你有投票:) – HRgiger

+0

我不需要通過commandbutton。我想在編輯輸入字段時觸發它 – roel

相關問題