2012-04-08 5 views
0

In meinem Code ausgelöst wird, ich habe einen PrimeFaces' Assistenten Komponente mit mehreren Registerkarten, wie folgend:JSF 2.0: <f:ajax> 's Hörer nicht

<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> 

Dies ist der Code für den Managed 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 
} 

In 1 der Registerkarte habe ich eine <h:selectOneMenu> Komponente, die ein <f:ajax> Tag enthält. Ich habe keine Ahnung, warum der Hörer nur ausgelöst wird, wenn ich die Option wähle. Wenn ich andere Optionen aus der Liste wähle, wird der Listener nie ausgelöst. Mit anderen Worten, ich sah nie DONE auf der Konsole gedruckt.

* UPDATE ***: Das Problem stellt sich heraus zu kommen aus der folgenden 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; 
    } 
} 

Wenn ich die <h:selectOneMenu> wie folgt zu ändern:

<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> 

und Update die mrBean.doSomething Funktion wie folgt:

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

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

alles funktioniert perfekt.

Ich wäre sehr dankbar, wenn Sie mir eine Erklärung geben könnten, was ich mit der Converter falsch gemacht habe.

Mit freundlichen Grüßen,

James Tran

+0

Haben Sie versucht, das Attribut event = 'change' in der Registerkarte hinzuzufügen? –

+0

@djaqeel Wenn ich jetzt falsch liege, ist es der Standardwert. Ich habe es gerade versucht und es funktioniert auch nicht so gut. –

+0

Nur neugierig, versuchen Sie, das Etikett simplify, nur die .name ohne den Dollar und die anderen ... – Daniel

Antwort

0

Verwenden # {mrBean.doSomething()} mit den Klammern oder den Ereignisparameter der Methode hinzufügen.