5

Richfaces a4j:ajax コンポーネントで実装されたオプションの ajax リスナーを持つ単純な複合コンポーネントがあります。

インターフェイス定義は次のとおりです。

<!-- INTERFACE -->
<composite:interface name="inplaceInput">
    <composite:attribute name="value" required="true" />
    <composite:attribute name="render" default="@this" />
    <composite:attribute name="ajaxListener" method-signature="void actionListener(javax.faces.event.AjaxBehaviorEvent)" />
</composite:interface>

次のコードは、反対のレンダリング条件で 2 つの複製されたブロックを使用して正常に動作します。

<composite:implementation>
    <rich:inplaceInput value="#{cc.attrs.value}" rendered="#{!empty cc.attrs.ajaxListener}">
        <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />
    </rich:inplaceInput>
    <rich:inplaceInput value="#{cc.attrs.value}" rendered="#{empty cc.attrs.ajaxListener}">
        <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" />
    </rich:inplaceInput>
</composite:implementation>

しかし、私のコンポーネントははるかに複雑になるため、重複を避けたいと思います...

a4j:ajax でレンダリングされた条件を使用することは、私の最初のアイデアでした:

<rich:inplaceInput value="#{cc.attrs.value}">
    <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" rendered="#{!empty cc.attrs.ajaxListener}"  />
    <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" rendered="#{empty cc.attrs.ajaxListener}" />
</rich:inplaceInput>

しかし、それは機能せず、エラーは非常にあいまいです:

javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.ajaxListener}'
at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodExpression.invoke(TagAttributeImpl.java:444)
at org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener.processAjaxBehavior(MethodExpressionAjaxBehaviorListener.java:73)

ツリーに両方のコンポーネントが必要ないため、 ac:if ハンドラーを試しました。

<rich:inplaceInput value="#{cc.attrs.value}">
    <c:if test="#{!empty cc.attrs.ajaxListener}">
        <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />
    </c:if>
    <c:if test="#{empty cc.attrs.ajaxListener}">
        <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" />
    </c:if>
</rich:inplaceInput>

そして、別のエラーが発生しました (ajaxListener="#{itemList.updateValue}" を使用):

javax.el.PropertyNotFoundException: /pages/itemList.xhtml @71,81 ajaxListener="#{itemList.updateValue}": Property 'updateValue' not found on type com...ItemListManager

属性が値を返す EL である場合、デフォルト値をテストできます。リスナーが設定されているかどうかを示すブール属性を追加することもできます...または、何もしないcomponentType Beanにデフォルトのメソッドを追加します...しかし、それはきれいではありません...

値またはメソッドバインディングにアクセスせずに属性が設定されているかどうかをテストするにはどうすればよいですか?

アイデアをお寄せいただきありがとうございます。

Rgds、

FM

4

1 に答える 1

5

次のように、複合コンポーネントの使用ページで値式が定義されているかどうかをチェックするcc.getValueExpression()fromクラスを使用できます。UIComponent

<c:if test="#{!empty cc.getValueExpression('ajaxListener')}">     
  <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />     
</c:if> 
于 2012-02-17T15:49:39.587 に答える