2011-07-20 12 views
5

Mam prosty komponent złożony z opcjonalnym detektorem ajax zaimplementowanym z komponentem richfaces a4j: ajax.Komponent kompozytowy JSF2 - warunek atrybutu metody istnieje

Oto definicja interfejs:

<!-- 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> 

Poniższy kod działa poprawnie przy użyciu dwóch zduplikowane bloki z przeciwnej świadczonych Stan:

<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> 

ale chcę, aby uniknąć powielania, ponieważ mój składnik jak być znacznie bardziej skomplikowane ...

Korzystanie z renderowanym warunkiem na a4j: ajax był mój pierwszy pomysł:

<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> 

Ale to nie działa, a błąd jest dość niejasne:

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) 

Próbowałem z AC: jeśli handler dlatego, że drzewo nie musi mieć oba składniki:

<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> 

A potem dostał inny błąd (przy użyciu ajaxListener = "# {itemList.updateValue}"):

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

Jeśli atrybutem był EL zwracający wartość, mógłbym przetestować wartość domyślną. Mogę również dodać atrybut boolean do określenia, czy słuchacz jest ustawiony ... Lub dodać domyślną metodę bean komponentu, nie robiąc nic ... Ale to nie jest piękne ...

Jak mogę sprawdzić, czy atrybut jest ustawić bez dostępu do jego wartości lub metody wiązania?

Dzięki z góry za wszelkie pomysł

Rgds,

FM

Odpowiedz

5

Można użyć cc.getValueExpression() z UIComponent klasy, która sprawdzi, czy wartość wyrażenia jest zdefiniowana w wykorzystaniem stronie swojej zespolonej, tak:

<c:if test="#{!empty cc.getValueExpression('ajaxListener')}">  
    <a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />  
</c:if> 
+0

Czy są jakieś specjalne wymagania, aby z tego skorzystać? Po pierwsze, mój parser EL nie lubi(). Działa z [], ale wtedy pojawia się błąd podczas uzyskiwania dostępu do strony z napisem "UINaming Container nie ma właściwości getValueExpression". – Louise

+0

Louise: Aby korzystać z tego kodu, musisz użyć wersji 2.2 programu EL-api. – Florian

Powiązane problemy