1

次のような複合 (X) があります。

<composite:interface>
  <composite:attribute name="textValue" />
  <composite:attribute name="textValueChangeListner"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" />

<composite:implementation>          
      <ice:inputText
                      value="#{cc.attrs.textValue}"
                      valueChangeListener="#{cc.attrs.textValueChangeListner}"/>

JSFページには次のようなものがあります:

<X:iText
textValue="#{cardBean.getCardValue}"
textValueChangeListner="#{cardHandler.cardValueChanged}" />  

上記のコードは正常に動作します。ただし、「textValueChangeListner」が JFace ページからコンポジットに渡されない場合は機能しません。すなわち:

<X:iText
textValue="#{cardBean.getCardValue}" /> 

エラー: [javax.enterprise.resource.webcontainer.jsf.lifecycle] EL 式 '#{cc.attrs.textValueChangeListner}' を使用してページを使用して複合コンポーネントを解決できません: javax.faces.FacesException: 複合コンポーネントを解決できませんEL式「#{cc.attrs.textValueChangeListner}」を使用したページの使用から

私のシナリオでは、ページ開発者が「textValueChangeListner」を複合コンポーネントに提供する場合と提供しない場合があることが必要です。どうすればそれを達成できますか?

4

2 に答える 2

2

ここには 2 つのオプションがあります。最初の 1 つは簡単な方法です。ユーザーが Value Change リスナーを指定しなかった場合、valueChangeListener を使用せずに別の入力テキストをレンダリングするだけです。

<ice:inputText
                  value="#{cc.attrs.textValue}"
                  valueChangeListener="#{cc.attrs.textValueChangeListener}"
                  rendered="#{!empty cc.attrs.textValueChangeListener}"/>

どのような場合でも valueChangeListener が必要な場合は、属性にデフォルト値を適用します。

<composite:attribute name="textValueChangeListener"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
                     required="false"
                     default="#{cc.valueChangedListener}" />

これを行うには、複合コンポーネントをバッキング Bean にバインドする必要があります。そして、次のようにインターフェース宣言を介してコンポーネントのバッキング Bean タイプを定義する必要があります。

<composite:interface componentType="yourComponentBean">
<composite:attribute name="textValueChangeListener"
                       method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
                     required="false"
                     default="#{cc.valueChangedListener}" />
</composite:interface>

そして、これがデフォルトの ValueChangedListener を実装する yourComponentBean です。

@FacesComponent("yourComponentBean")
public class YourComponentCC extends UINamingContainer
{
    public void valueChangedListener(ValueChangeEvent ev)
    {
       ....
    }
}

ところでcc、コンポーネントの componentType として定義されているバッキング Bean にアクセスするための EL のショートカットです。クラスで定義されたメソッドをcc.valueChangedListener呼び出します。valueChangedListenerYourComponentCC

于 2013-01-31T09:39:32.957 に答える
2

属性の名前をに変更し、属性をvalueChangeListener使用しtargetsます。

<composite:attribute name="valueChangeListner"
                     method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" 
                     targets="text" />

text対象の入力コンポーネントの ID です。

<ice:inputText id="text" ... />

を取り外しvalueChangeListenerます。

于 2013-01-31T11:37:39.997 に答える