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つまり、コンソールに印刷されているのを見たことがありません。

*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

よろしくお願いします、

ジェームズ・トラン

4

1 に答える 1

0

中かっこで#{mrBean.doSomething()}を使用するか、メソッドにイベントパラメータを追加します。

于 2012-04-08T20:31:33.800 に答える