0

我有多个带有 ap: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()

我怎样才能对 Prime ajax 做同样的事情?

4

2 回答 2

2

AjaxBehaviorEvent不是 RichFaces 特有的。它特定于 JSF2 本身。所以你可以继续在 PrimeFaces 中使用它。

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

作为替代方案,或者在其他地方确实不可能的情况下,您始终可以使用新的 JSF2UIComponent#getCurrentComponent()方法。

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

顺便说一句,同样的构造应该与 JSF2 自己的<f:ajax>. 我看不出有任何理由在<p:ajax>这里使用。但是,如果您实际使用 PrimeFaces 组件(例如<p:inputText>.


与具体问题无关event="change",已经是默认设置。你可以省略它。

于 2012-11-23T11:37:51.540 回答
-2

在 primefaces 中几乎相同:

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


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

如果您想通过按钮组件action/actionListener标签访问,您可以使用ActionEvent并且在任何情况下确保设置ajax="true"

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

import javax.faces.event.ActionEvent;

....

public void retrievePostalCodeCity(ActionEvent event) {
    ...
    }
于 2012-11-23T11:43:57.113 回答