2012-04-08 105 views
0

在我的代碼,我有一個PrimeFaces'有幾個選項卡精靈組件如下:JSF 2.0:<f:ajax>的偵聽器未觸發

<h:form id="myForm"> 
    <p:wizard flowListener="#{mrBean.flowControl}" widgetVar="wiz"> 
     <p:tab id="tab1"></p:tab> 
     <p:tab id="tab2"></p:tab> 
     <p:tab id="tab3"> 

      <h:selectOneMenu id="couponList" value="#{mrBean.coupon}" 
          converter="#{codeToCouponConverter}" > 
       <f:ajax listener="#{mrBean.doSomething}" execute="@this"/> 
       <f:selectItem noSelectionOption="true" itemLabel="Choose one..." /> 
       <f:selectItems value="#{mrBean.coupons}" var="c" 
           itemValue="#{c}" itemLabel="#{c.name} - $ #{c.discount}" /> 
      </h:selectOneMenu> 

     </p:tab> 
    </p:wizard> 
</h:form> 

這是託管bean代碼:

@ManagedBean(name = "mrBean") 
@ViewScoped 
public class MrBean { 
    private List<Coupon> coupons; 
    private Coupon  coupon; 

    public void doSomething() { 
     System.out.println("DONE"); 
    } 

    public String flowControl(FlowEvent event) { 
     ... 
    } 

    // Getters and Setters 
} 

在標籤1中,我有一個<h:selectOneMenu>組件,其中包含一個<f:ajax>標籤。我不知道爲什麼只有當我選擇Choose one...選項時纔會觸發聽衆。當我從mrBean.coupons列表中選擇任何其他選項時,偵聽器從不被觸發。換句話說,我從來沒有看到任何DONE印在控制檯上。

* UPDATE ***:這個問題原來從以下Converter現身:

@RequestScoped 
@ManagedBean 
public class CodeToCouponConverter implements Converter { 
    @EJB 
    private MrsBeanInterface mrsBean; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     String couponCode = value; 
     if (value != null) return mrsBean.getCoupon(couponCode); 
     else return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     if (value != null) { 
      Coupon c = (Coupon) value; 
      return c.getId(); 

     } else return null; 
    } 

    // Getters and Setters 
    public MrsBeanInterface getMrsBean() { 
     return mrsBean; 
    } 

    public void setMrsBean(MrsBeanInterface mrsBean) { 
     this.mrsBean = mrsBean; 
    } 
} 

如果我改變<h:selectOneMenu>如下:

<h:selectOneMenu id="couponList" value="#{mrBean.couponCode}" > 
    <f:ajax listener="#{mrBean.doSomething}" execute="@this"/> 
    <f:selectItem noSelectionOption="true" itemLabel="Choose one..." /> 
    <f:selectItems value="#{mrBean.coupons}" var="c" 
        itemValue="#{c.id}" itemLabel="#{c.name} - $ #{c.discount}" /> 
</h:selectOneMenu> 

和更新mrBean.doSomething功能如下:

@EJB 
private MrsBeanInterface mrsBean; 
private String couponCode; 
private Coupon coupon; 

public void doSomething() { 
    this.coupon = mrsBean.getCoupon(couponCode); 
    System.out.println("DONE"); 
} 

一切正常。

如果你能給我一個解釋我做錯了Converter的問題,我將不勝感激。

最好的問候,

詹姆斯陳

+0

您是否嘗試過在標籤中添加event ='change'屬性? – 2012-04-08 16:47:58

+0

@djaqeel如果我現在錯了,它是默認值。我剛剛嘗試過,但不起作用。 – 2012-04-08 16:52:40

+0

只是好奇,試圖simlify標籤,只顯示.name沒有美元和其他... – Daniel 2012-04-08 16:57:53

回答

0

使用#{mrBean.doSomething()}用括號或事件參數添加到方法。

相關問題