0

在我的代码中,我有一个 PrimeFaces 向导组件,其中包含以下几个选项卡:

<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在控制台上看到任何印刷品。

*更新***:问题原来来自以下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.

此致,

詹姆斯·特兰

4

1 回答 1

0

使用带有大括号的#{mrBean.doSomething()} 或将事件参数添加到方法中。

于 2012-04-08T20:31:33.800 回答