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
的問題,我將不勝感激。
最好的問候,
詹姆斯陳
您是否嘗試過在標籤中添加event ='change'屬性? –
2012-04-08 16:47:58
@djaqeel如果我現在錯了,它是默認值。我剛剛嘗試過,但不起作用。 – 2012-04-08 16:52:40
只是好奇,試圖simlify標籤,只顯示.name沒有美元和其他... – Daniel 2012-04-08 16:57:53