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
Haben Sie versucht, das Attribut event = 'change' in der Registerkarte hinzuzufügen? –
@djaqeel Wenn ich jetzt falsch liege, ist es der Standardwert. Ich habe es gerade versucht und es funktioniert auch nicht so gut. –
Nur neugierig, versuchen Sie, das Etikett simplify, nur die .name ohne den Dollar und die anderen ... – Daniel