2

その質問を適切に行う方法がわかりませんが、次のように試みます:質問はPrimefaces、コンポジットのJSF2カレンダーについてです..そのカレンダーが変更された後に呼び出されるイベントをキャッチしたい(そしてその新しい日付値をキャッチしたい)。

私の複合xhtml:

    <composite:interface componentType="myComponent">            
        <composite:attribute name="value" required="true"/>            
    </composite:interface>

    <composite:implementation>
            <p:calendar 
                id="tempCalendar"
                pattern="dd.MM.yyyy" value="#{cc.attrs.value}" 
                valueChangeListener="#{cc.valueChanged}"                   
                validator="DateValidator" converter="MyDateConverter" showOn="button" showButtonPanel="true" navigator="true" >

                <p:ajax event="dateSelect"  update="@this" listener="#{cc.event1}"/>                   
            </p:calendar>
    </composite:implementation>

私の複合のBean:

public void valueChanged(Object event) {

    log("valueChanged");
}

public void event1(AjaxBehaviorEvent ab) {
    log("Event1");
    if (ab != null && ab.getSource() != null && ab.getSource() instanceof Calendar) {
        //....
    }
}

コンポジットを使用しているページ:

<cc:inputdate value="#{mainBean.aDate}" />

上記のコードでは、コンポテンツ Bean の新しい値をキャッチしようとしていますが、ログは次のようになります。

  1. 値が変更されました

  2. イベント1

  3. 日付を決める

valueChangedListener にいるとき、カレンダーの古い値がまだあります。最後に新しい値が設定されます。

だから、まず第一に、複合ビーンに新しい価値を持たせたいと思っています..しかし、私の主な質問は次のとおりです。

変更されたときにそのカレンダーの新しい値をキャッチするイベントをmainBeanに実装する方法は?


編集:私の複合今:

<composite:interface componentType="myComponent">
    <composite:attribute name="value" required="true"/>
    <composite:attribute
            name="myListener"
            method-signature="void listener()" />

</composite:interface>

<composite:implementation>
    <h:panelGroup id="container">

        <p:calendar
            value="#{cc.attrs.value}"
            valueChangeListener="#{cc.valueChanged}"
            <p:ajax event="dateSelect"  update="@this,:buttonpanel" listener="#{cc.attrs.myListener}"/>
        </p:calendar>

    </h:panelGroup>
</composite:implementation>

そのようにして、メインページ (mainBean に接続) で呼び出します。

<cc:inputdate 
    value="#{mainBean.item.myDate}" 
    myListener="#{mainBean.event1}"/>

mainBean.java の変更後に evet をキャッチしたい...

4

2 に答える 2

2

コンポジットの属性として指定したので、次のようvalueに、継承されたバッキング コンポーネントのメソッドのいずれかで使用できるはずです。UIComponent#getAttributes()

Object value = getAttributes().get("value");
于 2013-03-24T12:00:18.547 に答える
2

コンポーネントのローカル値からアクセスできます。つまり、

私のテストFacelet

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<f:view>
    <h:head />
    <h:body>
        <h:form>
            <p:calendar pattern="dd.MM.yyyy">
                <p:ajax event="dateSelect" process="@this"
                    listener="#{testBean.event1}" />
            </p:calendar>
        </h:form>
    </h:body>
</f:view>
</html>

私のテストビーン

import org.primefaces.component.calendar.Calendar;

@ManagedBean(name="testBean")
@SessionScoped
public class TestBackingBean 
{
    public void event1(AjaxBehaviorEvent ab) 
    {
        if (ab != null) 
        {
            Calendar calendar =  (Calendar) ab.getSource();

            if(calendar != null)
            {
                System.out.println(String.format("Newly selected value: %s", 
                        calendar.getLocalValue()));
            }
        }
    }
}
于 2013-03-24T05:57:09.210 に答える